问题:
1,介绍MVCC实现原理
2.innoDB的底层索引结构
3.说一下mysql的innodb与MyISAM的区别?
4.索引是什么?有什么好处?
5.说说B+树和B树的区别
6.什么情况下会回表查询,什么是覆盖索引
7.联合索引失效的原因
8.索引失效的原因
9.事务的特性
10.事务的隔离级别
回答:
1.
MVCC(Multi-Version Concurrency Control)是多版本并发控制器,是由 undo 版本链 + Read View相结合实现的。
数据库表每行有三个隐藏列,记录修改表的事务id,指向旧版本的指针,旧版本记录在undo.log日志中,由指针形成版本链。
Read View会生成四个与事务id有关的字段,MVCC通过比较改表的事务id和Read View中的事务id大小,判断数据库内容是否可见。
使用场景在读提交和可重复读这两个事务隔离级别。区别在于读提交在每次查询执行前都生成 Read View,可重复读只在第一次查询前生成Read View。
2.
底层数据结构是B+ 树,InnoDB的叶子节点是双向链表,记录按照聚簇索引有序存储
3.
事务 :InnoDB有ACID事务支持,MyISAM不支持事务
索引结构: InnoDB是聚簇索引,MyISAM 是非聚簇索引
锁粒度:InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。
4.
索引类似于书籍的目录,可以减少扫描的数据量,提高查询效率。
5.
在B+树中,数据都存储在叶子节点上,而非叶子节点只存储索引信息;而B树的非叶子节点既存储索引信息也存储部分数据。
B+树的叶子节点使用链表相连,便于范围查询和顺序访问;B树的叶子节点没有链表连接。
B+树的查找性能更稳定,每次查找都需要查找到叶子节点;而B树的查找可能会在非叶子节点找到数据,性能相对不稳定。
6.
二级索引叶子节点存:索引列的值 + 主键值;不存完整行数据。
如果查询的数据不在二级索引里,就通过叶子节点的主键值进行主键索引,就能查询到数据了,这个过程就是回表。
覆盖索引是指一个索引包含了查询所需的所有列,因此不需要访问表中的数据行就能完成查询。
7.
必须满足最左匹配原则,否则失效
8.
1.模糊匹配,like 2.使用函数
3.表达式计算 4.使用联合索引不满足最左匹配原则
9.
ACID
原子性(Atomicity 回滚日志实现****),一致性(Consistency**** 持久性+原子性+隔离性实现****)****
隔离性(Isolation MVCC或锁机制****),持久性(Durability**** 重做日志实现****)****
10.
读未提交(read uncommitted) ,可能发生脏读、不可重复读和幻读现象;
读提交(read committed) ,可能发生不可重复读和幻读现象,但是不可能发生脏读现象;在「每个语句执行前」都会重新生成一个 Read View
可重复读(repeatable read mysql默认级别 ) ,可能发生幻读现象,但是不可能脏读和不可重复读现象;「启动事务时」生成一个 Read View
串行(xing)化(serializable) ;脏读、不可重复读和幻读现象都不可能会发生。
通过加读写锁的方式来避免并行访问