索引 - MySQL 面试题及答案
7.什么是索引?
相信大家小时候学习汉字的时候都会查字典,想想你查字典的步骤,我们是通过汉字的首字母 a~z 一个一个在字典目录中查找,最终找到该字的页数。想想,如果没有目录会怎么样,最差的结果是你有可能翻到字典的最后一页才找到你想要找的字。
索引就**「相当于我们字典中的目录」**,可以极大的提高我们在数据库的查询效率。
8.索引失效的场景有哪些?
以下随便列举几个,不同版本的 mysql 场景不一
- 1.最左前缀法则(带头索引不能死,中间索引不能断
- 2.不要在索引上做任何操作(计算、函数、自动/手动类型转换),不然会导致索引失效而转向全表扫描
- 3.不能继续使用索引中范围条件(bettween、<、>、in等)右边的列,如:
select a from user where c > 5 and b = 4;复制
- 4.索引字段上使用(!= 或者 < >)判断时,会导致索引失效而转向全表扫描
- 5.索引字段上使用 is null / is not null 判断时,会导致索引失效而转向全表扫描。
- 6.索引字段使用like以通配符开头(‘%字符串’)时,会导致索引失效而转向全表扫描,也是最左前缀原则。
- 7.索引字段是字符串,但查询时不加单引号,会导致索引失效而转向全表扫描
- 8.索引字段使用 or 时,会导致索引失效而转向全表扫描
9.为什么采用 B+ 树,而不是 B-树
B+ 树只在叶子结点储存数据,非叶子结点不存具体数据,只存 key,查询更稳定,增大了广度,而一个节点就是磁盘一个内存页,内存页大小固定,那么相比 B 树,B- 树这些**「可以存更多的索引结点」**,宽度更大,树高矮,节点小,拉取一次数据的磁盘 IO 次数少,并且 B+ 树只需要去遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,效率更高。
10.WAl 是什么?有什么好处?
WAL 就是 Write-Ahead Logging,其实就是**「所有的修改都先被写入到日志中,然后再写磁盘」**,用于保证数据操作的原子性和持久性。
好处:
- 1.「读和写可以完全地并发执行」,不会互相阻塞
- 2.先写入 log 中,磁盘写入从**「随机写变为顺序写」**,降低了 client 端的延迟就。并且,由于顺序写入大概率是在一个磁盘块内,这样产生的 io 次数也大大降低
- 3.写入日志当数据库崩溃的时候**「可以使用日志来恢复磁盘数据」**
11.什么是回表?

回表就是先通过数据库索引扫描出该索引树中数据所在的行,取到主键 id,再通过主键 id 取出主键索引数中的数据,即基于非主键索引的查询需要多扫描一棵索引树.
12.什么是索引下推?
如果存在某些被索引的列的判断条件时,MySQL 将这一部分判断条件传递给存储引擎,然后由存储引擎通过判断索引是否符合 MySQL 服务器传递的条件,「只有当索引符合条件时才会将数据检索出来返回给 MySQL 服务器」 。
13.什么是覆盖索引?
覆盖索引(covering index)指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取,可以减少回表的次数。比如:
select id from t where age = 1;id 为主键索引,age 为普通索引,age 这个索引树存储的就是逐渐信息,可以直接返回
14.什么是最左前缀原则?
最左前缀其实说的是,在 where 条件中出现的字段,「如果只有组合索引中的部分列,则这部分列的触发索引顺序」,是按照定义索引的时候的顺序从前到后触发,最左面一个列触发不了,之后的所有列索引都无法触发。
比如**「有一个 (a,b,c) 的组合索引」**
where a = 1 and b = 1此时 a,b 会命中该组合索引
where a = 1 and c = 1此时 a 会命中该组合索引, c 不会
where b = 1 and c = 1此时不会命中该组合索引
15.普通索引和唯一索引该怎么选择?
- 查询
- 当普通索引为条件时查询到数据会一直扫描,直到扫完整张表
- 当唯一索引为查询条件时,查到该数据会直接返回,不会继续扫表
- 更新
- 普通索引会直接将操作更新到 change buffer 中,然后结束
- 唯一索引需要判断数据是否冲突
所以**「唯一索引更加适合查询的场景,普通索引更适合插入的场景」**
最近建一些几十个工作内推群,各大城市都有,群里目前已经收集了很多内推岗位,大厂、中厂、小厂、外包都有。 欢迎HR、开发、测试、运维和产品加入。

扫描下方微信,备注:网站+所在城市,即可拉你进工作内推群。
