面试小知识:MySQL索引相关

前言

本模板主要是一些面试相关的题目,对于每一道问题,我会提供简单的解答,答案的来源主要是基于本身看了各方资料以后的理解,若是有错的,欢迎指点出来。面试

1. 什么是最左前缀原则?

如下回答所有是基于MySQL的InnoDB引擎sql

例如对于下面这一张表性能

若是咱们按照 name 字段来创建索引的话,采用B+树的结构,大概的索引结构以下3d

若是咱们要进行模糊查找,查找name 以“张"开头的全部人的ID,即 sql 语句为code

select ID from table where name like '张%'

因为在B+树结构的索引中,索引项是按照索引定义里面出现的字段顺序排序的,索引在查找的时候,能够快速定位到 ID 为 100的张一,而后直接向右遍历全部开头的人,直到条件不知足为止。blog

也就是说,咱们找到第一个知足条件的人以后,直接向右遍历就能够了,因为索引是有序的,全部知足条件的人都会汇集在一块儿。排序

而这种定位到最左边,而后向右遍历寻找,就是咱们所说的最左前缀原则索引

2. 为何用 B+ 树作索引而不用哈希表作索引?

一、哈希表是把索引字段映射成对应的哈希码而后再存放在对应的位置,这样的话,若是咱们要进行模糊查找的话,显然哈希表这种结构是不支持的,只能遍历这个表。而B+树则能够经过最左前缀原则快速找到对应的数据。table

二、若是咱们要进行范围查找,例如查找ID为100 ~ 400的人,哈希表一样不支持,只能遍历全表。模板

三、索引字段经过哈希映射成哈希码,若是不少字段都恰好映射到相同值的哈希码的话,那么造成的索引结构将会是一条很长的链表,这样的话,查找的时间就会大大增长。

3. 主键索引和非主键索引有什么区别?

例如对于下面这个表(其实就是上面的表中增长了一个k字段),且ID是主键。

主键索引和非主键索引的示意图以下:

其中R表明一整行的值。

从图中不难看出,主键索引和非主键索引的区别是:非主键索引的叶子节点存放的是主键的值,而主键索引的叶子节点存放的是整行数据,其中非主键索引也被称为二级索引,而主键索引也被称为聚簇索引

根据这两种结构咱们来进行下查询,看看他们在查询上有什么区别。

一、若是查询语句是 select * from table where ID = 100,即主键查询的方式,则只须要搜索 ID 这棵 B+树。

二、若是查询语句是 select * from table where k = 1,即非主键的查询方式,则先搜索k索引树,获得ID=100,再到ID索引树搜索一次,这个过程也被称为回表。

如今,知道他们的区别了吧?

4. 为何建议使用主键自增的索引?

对于这颗主键索引的树

若是咱们插入 ID = 650 的一行数据,那么直接在最右边插入就能够了

可是若是插入的是 ID = 350 的一行数据,因为 B+ 树是有序的,那么须要将下面的叶子节点进行移动,腾出位置来插入 ID = 350 的数据,这样就会比较消耗时间,若是恰好 R4 所在的数据页已经满了,须要进行页分裂操做,这样会更加糟糕。

可是,若是咱们的主键是自增的,每次插入的 ID 都会比前面的大,那么咱们每次只须要在后面插入就行, 不须要移动位置、分裂等操做,这样能够提升性能。也就是为何建议使用主键自增的索引。

最后推广下个人公众号:苦逼的码农,文章都会首发于个人公众号,期待各路英雄的关注交流。

相关文章
相关标签/搜索