🍰分享几道关于MySQL索引的重点面试题
前言
索引是一种数据结构,它对数据库中一个或多个列的值进行排序,以便数据库能够高效地获取数据。
打个比方,数据库中的索引就相当于书中的目录。
当你想查找书中的某个知识点时,可以直接从目录中查找,而不用逐页查找。
虽然是一本书,但是索引的一个缺点就是修改数据库的时候修改索引需要花费更多的时间。
但是你真的了解MySQL索引吗?这些问题将帮助您了解有关索引的一些重要事项:
1.最左边前缀规则是什么?
以下答案均基于MySQLInnoDB引擎。
例如下表
:name使用B+树结构来创建字段索引。
粗略的索引结构如下:
要进行模糊搜索,找到名字存在的每个人的ID。
以“张”开头。
即SQL语句为
selectIDfromtablewherenamelike'Zhang%'
在B+树结构的索引中,索引项排序如下。
字段在索引定义中出现的顺序,索引将按照该顺序包含在搜索中。
此时可以快速找到ID为100的张毅,然后直接遍历所有头朝右的,直到不满足条件为止。
。
即找到第一个符合条件的人后,就向右遍历即可。
索引已排序,因此符合条件的每个人都会聚集在一起。
一起。
。
将这种位置放到最左边,然后通过向右导航找到,就是我们所说的最左前缀原则。
2.为什么使用B+树而不是哈希表作为索引?
1.哈希表将索引字段映射到相应的哈希码。
这种情况下如果要进行模糊查找,显然不支持哈希表结构,只能遍历这张表。
B+树可以通过最左前缀原则快速找到对应的数据。
2.如果你想做范围搜索,比如搜索ID为100到400的人,哈希表也不支持,只能做全量搜索。
桌子。
3.索引字段通过哈希映射到哈希码。
当多个字段映射到同一个值的哈希码时,形成的索引结构就会变得很长。
对于链表,搜索时间显着增加。
3.主键索引和非主键索引有什么区别?
例如下表(实际上是上表加了k个字段),ID为主键。
主键索引和非主键索引的示意图如下:
其中R代表值.整行的。
从图中可以很容易看出主键索引和非主键索引的区别。
非主键索引的叶节点存储值。
主键索引的叶子节点存储主键值,非主键索引也称为辅助索引,也称为主键索引。
聚集索引。
让我们根据这两个结构运行一个查询,看看有什么区别。
1.如果查询语句是select*fromtablewhereID=100,是主键查询方式,则只需要查找ID的B+树即可。
2.如果查询语句是select*fromtablewherek=1,属于非主键查询方式,那么先查找k索引树检索到ID=100,然后只执行一次ID索引树的过程也称为回表。
现在你知道两者之间的区别了吗?
4.为什么推荐使用主键自增索引?
如果是在主键索引树中,可以直接插入ID=650的数据行。
最右边
但是,如果插入ID=350的数据行,由于B+树是有序的,所以需要移动下叶子节点,为插入腾出空间。
对于ID=350的数据,如果R4的数据页已经满了,就需要进行分页操作,这样就更糟糕了。
但是,如果主键是自增的,每次插入的ID都比前一个键大,则每次只需向后插入即可,无需移动主键。
地点或部门等这可能会提高性能。
这就是为什么建议使用带有自增主键的索引。
总结