1. MySQL索引结构,索引优化,索引失效?
(1)索引结构
常用的索引结构主要包含hash索引、b树结构的索引以及b+树结构的索引;
目前MySQL默认的Innodb引擎使用的是b+树索引。b+树相较于hash索引的优势在于b+树可以实现范围查询,b+树支持索引完成排序并且在联合索引的查询过程中是支持最左匹配原则的。
b+树相较于b树的优势在于b+树仅在叶子节点中存放数据,非叶子节点仅存储指针。因此相较于b树而言,b+树的高度更低,查询数据的IO次数会更少,平均查询效率更高。
(2)索引优化
(3)索引失效
使用范围查询导致索引失效:MySQL使用联合查询时会使用到最左匹配原则,左边索引相等的情况下按照右边索引排序,但是当左边索引使用了范围查询后,无法保证右边索引有序,此时索引失效。
模糊查询索引失效;
2. MySQL的ACID是什么?原子性、持久性和隔离性是如何实现的?
(1)ACID
A(Atomicity):原子性;
C(Consistency):持久性;
I(Isolation):隔离性;
D(Durability):一致性;
(2)原子性的实现原理
MySQL通过回滚操作实现事务的原子性,而事务的回滚主要是依赖 undo log(回滚日志,用于记录数据被修改前的信息) 实现的。
(3)持久性的实现原理
MySQL通过 redo log(重做日志) 实现事务的持久性,当事务提交之后会把所有修改信息都会存到该日志中。
(4)隔离性的实现原理
读已提交(READ COMMITTED)和可重复读(REPEATABLE READ)通过MVCC实现;
在读已提交隔离级别下每次select的时候新生成一个版本号,所以每次select的时候读的不是一个副本而是不同的副本;
在可重复读隔离级别下只生成一个版本号,所以读到的都是相同的数据;
3. 事务的隔离级别?在不同的隔离级别下,读写场景会出现什么问题?MVCC原理?
4. 数据库的三大范式?
5. 聚簇索引和非聚簇索引?最左匹配原则?
6. 索引建立的原则,索引越多越好吗?