Fork me on GitHub

mysql面试题总结

  1. 描述一下B+树索引的结构?

  2. 什么叫做聚簇索引?
    聚簇索引是指叶子节点包含完整数据列,即主键索引和其余所有数据列,innodb中以主键索引构建的B+Tree即为聚簇索引,按照主键id排序。其余的索引皆为稀疏索引。

  3. B树和B+树的区别是什么?为什么选用B+树?

  4. 为什么不使用Hash结构来作索引?

  • Hash不能很好的支持范围查询
  • hash碰撞问题
  • hash一般需要一段连续的空间来存储hash表,这样方便维护hash表内部的链表或者数组的移动。
  1. 为什么不用二叉树来做索引?
  • 极端情况会弱化为链表,查找速度很慢。
  • 数据变多,树会变的很高,导致查找时IO次数增多。
  1. 为什么不用红黑树来做索引?
  • 红黑树的高度维护
  • 插入效率不高,需要维护平衡,伴随着左旋/右旋操作
  • 虽然平衡了,但是要树高度也会随着数据量变大而增高。
  1. 为什么建议主键用自增id而不使用UUID?

    • 因为聚簇索引是按照主键进行排序的,如果是UUID则是无序插入,是一个随机过程,可能在维护B+树时频繁造成页分裂和记录移动的场景,增加了不必要的磁盘开销。
    • 自增id占用的空间更小,能承载更多的数据。
  2. 什么是索引覆盖?什么是回表?

  • 查询的字段和条件字段能从索引中直接获取,不需要回表查找聚簇索引。
  • 回表:从二级索引过滤完成之后,需要根据二级索引关联的主键值去聚簇索引中读取完整的数据列。
  1. 索引失效的场景有哪些?
  • 索引列使用函数、运算等操作,不能使用索引。
  • in、is not null、!=、or等操作命中记录数太多,不如直接聚簇索引查询,可能成本分析导致不能走索引。
  • 联合索引没有使用最左前缀原则。
  • order by、group by没有使用到所以,用了文件排序或者临时表完成。
  • 索引字段发生了隐式替换。
  • like的通配符在最前面 like ‘%xxx’
  1. 设计索引的原则有哪些?需要注意哪些问题?
  2. 常见的SQL优化方向有哪些?怎么做SQL优化?
  3. explain type列有哪些值,代表什么含义?
  4. explain extra列有哪些值,代表什么含义?
  5. 索引下推是什么?
  6. 为什么联合索引是最左前缀原则?
  7. 索引树大约有多高?能存多少数据?
  8. 非叶子节点存放的是什么?
  • 非叶子节点是目录项数据页,其中存放的是索引值和指向叶子节点(或者下层非叶子节点)的页号。
  1. 事务的四大特性?
    ACID:
  • A:原子性
  • C:一致性
  • I:隔离性
  • D:持久性
  1. 原子性怎么实现的?
  • 在写记录的操作会写undo log,记录上隐藏列的roll_pointer会指向上一条版本记录,如果需要回滚可以找到对应的历史版本记录,保证了原子性。
  1. 持久性怎么实现的?
  • 持久性是通过redo log写磁盘来实现的。
  • 对数据修改的物理日志,比如“对表空间号为2的数据页号为50的偏移量xx地址的记录修改数据内容是什么”,在事务过程中会写入磁盘。
  • redolog写入是二阶段,和binlog保持了一致性。redo log可以设置在事务提交的时候写到OS Cache缓存或者磁盘。
  1. 事务的隔离级别有哪些?
  • RU、RC、RR、串行化
  1. 不同隔离级别在并发读写下有哪些问题?
  • 脏写:事务内修改了一个未提交事务修改的值。
  • 脏读:事务内读到了一个未提交事务修改的值。
  • 不可重复读:事务内多次读的结果不一致。
  • 幻读:读到了符合条件的多条新增记录。
  1. 什么是MVCC?
  1. 什么是undo log?
  2. 什么是redo log?
  3. 一条SQL执行的过程是怎样的?
  4. Mysql有那些锁?
  5. 插入一条SQL的过程?
  6. RR隔离级别下可重复读的原理?
  7. RR下的加锁语句分析。
  8. Innodb和Myisam存储引擎的区别有哪些?
  • Innodb支持事务、行锁。而Myisam不支持事务和行锁。
  • Innodb数据在聚簇索引上,而Myisam存储引擎索引和数据分离,索引只保存指向数据文件的地址指针。
  1. Buffer Pool是什么?描述一下结构和运行原理?
  1. Mysql count(字段) 和 count(*) 有什么区别?哪个效率高?
  • count(字段)不统计null值。
  • 效率相差不大,就是字段有二级索引会直接扫描二级索引,效率更高。
  1. 什么是file sort,怎么避免?
  • 不能使用到索引的order by场景会使用文件排序,文件排序可能在内存,也可能在磁盘中排序,效率很低。
  • 避免使用索引排序。
  1. 连接查询的原理是什么样子的?
  • 嵌套循环查询(有索引)和基于块的嵌套循环查询(没有索引,利用join_buffer)。
  • 连接查询分为驱动表和被驱动表,驱动表每行记录会一直和被驱动表进行查询。
  1. 连接查询有什么优化吗?什么是基于块的嵌套循环查询?
  • 对连接的字段加索引
  • 连接查询不能使用索引则调整join_buffer的大小。
  1. GAP锁的作用是什么?
  • GAP锁之间不相互阻塞,只阻塞插入过程的插入意向锁,避免在RR隔离级别下插入幻影记录。
  1. RR怎么解决一部分的幻读问题?
  • 快照读场景:事务内多次快照读,只会在第一次快照读时生成对应的ReadView,通过MVCC访问机制,去访问对应的undo log版本链,来解决了不可重复读和幻读问题。
  • 当前读:如果当前读是加锁读,那么是通过加GAP锁来防止间隙处插入符合条件新的记录。Gap锁阻塞插入意向锁,所以是通过锁排队场景来避免当前读的幻读的。
  1. 什么是binlog?和redolog的区别是什么?
  2. 死锁是怎么发生的?怎么检测死锁?
  3. 如何避免死锁?

image-20220701105558852

-------------本文结束感谢您的阅读-------------

本文标题:mysql面试题总结

文章作者:夸克

发布时间:2021年10月01日 - 10:10

最后更新:2022年07月01日 - 10:07

原始链接:https://zhanglijun1217.github.io/2021/10/01/mysql面试题总结/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。