MySQL面试常见题目(二)

原文地址:MySQL面试常见题目(二)

1、聚集索引和非聚集索引的区别?

  1. 一张表中只能存在一个聚集索引,非聚集索引不限制数量。

  2. 聚集索引中键值的逻辑顺序决定表中相应行的物理顺序,非聚集索引中的逻辑顺序与磁盘上行的物理顺序不同。

  3. 聚集索引的物理存储按索引排序,非聚集索引不按索引排序。

  4. 索引是通过二叉树来描述数据结构的,聚集索引的叶子节点就是数据节点,非聚集索引的叶子节点还是索引节点,只是有个指针指向对应的数据块。

2、使用聚集索引或非聚集索引的时机?

3、如何选择合适的分布式主键方案?

  1. 数据库自增长序列或字段。

  2. UUID。

  3. Redis生成ID。

  4. Twitter的snowflake算法。

  5. 利用zookeeper生成唯一ID。

  6. MongoDB的objectId。

4、事务的隔离级别有哪些?

  1. 读未提交(read uncommitted)。

  2. 读已提交(read committed)。

  3. 可重复读(repeatable read)。

  4. 串行化(serializable)。

5、MySQL默认的事务隔离级别是可重复读(repeatable read)。

6、幻读、脏读、不可重复读的定义?

  1. 事务A、B交替执行,因为A读到B未提交的内容,致使A被B干扰到,这是脏读。

  2. 不可重复读:同一事务范围内,相同查询返回不同数据。

  3. 幻读:A查询某范围数据,并发事务B操作该范围数据且悄悄提交,A再次查询时,两次数据不一致。

7、MySQL的乐观锁和悲观锁?

    a、悲观锁:当事务获得悲观锁时,任何事务都不可对数据进行操作,只能等释放。

    b、乐观锁:允许多个事务同时对数据进行操作,可通过版本号机制或CAS实现。

8、高并发情况下,MySQL如何安全修改同一行数据?

首先需要保证的就是当一个线程操作当前数据时,其它线程无法对当前数据进行操作,一般有乐观锁和悲观锁两种方案。

悲观锁的思想就是当前线程操作数据时,其它线程无法访问,像如下SQL:

select * from User where name=‘123’ for update

上述SQL锁定user表中所有name为123的记录,在当前事务操作提交之前,别的线程都无法对这些数据进行操作。

乐观锁的思想就是有线程修改就先放过去进行修改操作,如果别的线程没操作过这条数据,就可修改成功,操作过就直接失败或是重试,一般用版本号机制或是CAS实现。

9、select for update有什么含义?会锁表、锁行还是?

单纯的select不会加锁,但select for update除查询外,还会加锁,而且是悲观锁,如果SQL中没有用到主键或是索引,则加表锁,反之就是行锁。

至此,本次分享就结束了,后期会慢慢补充的。

以上仅为个人观点,不一定准确,能帮到各位那是最好的。

好啦,到这里本文就结束了,喜欢的话就来个三连击吧。

以上均为个人认知,如有侵权,请联系删除。

 

おすすめ

転載: blog.csdn.net/luyaran/article/details/121120350