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中没有用到主键或是索引,则加表锁,反之就是行锁。

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

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

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

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

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luyaran

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值