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