本篇文章介绍了MySQL索引的13个知识点,相信对各位面试非常有帮助,现在将它分享给各位。
数据库索引有关的知识,说实在的,真的是很复杂,本来想好好看看这方面的东西,然后写篇文章详细谈谈的,后来发现索引的知识太难太深,要谈得全面又详细真的很难,所以最后还是把自己学到的和想到的变成下面一个个的问题,希望能对大家帮助!
知识点
问题1:什么是数据库索引?
数据库索引是数据库系统中一个重要的概念,索引也叫做 key
,是一种用于提升数据库查询效率的数据结构,我们可以把索引理解成一本书的目录,通过目录我们可以快速找到对应章节的内容,同样的,通过数据库索引,我们可以快速找到数据表中对应的记录。
总而言之,索引就像给数据表建了一个目录一样。
问题2:为什么在使用索引?
1 . 使用索引大大减少了存储引擎需要扫描的数据量,如果没有使用索引的话,每查询一行数据都要对数据表进行扫描,这样的话会非常慢。
2 . 由于索引已经排好序的,所以对数据表进行 ORDER BY
和 GROUP BY
等操作时,可以很快得到结果。
3 . 索引可以将随机的 I/O
转为顺序的 I/O
,避免高昂的磁盘 IO
成本,提升查询效率。
问题3:MySQL索引在哪个模块中实现的?
(免费学习视频教程推荐:mysql视频教程)
MySQL
的索引是在存储引擎这一层实现的,因此每一种存储引擎都有不同的实现方式,对同一种索引的处理方式也完成不同。
问题4:为什么设置了索引却不起作用?
如果使用以 %
开头的 LIKE
语句进行模糊匹配,则无法使用索引,如:
SELECT * FROM users WHERE name LIKE '%小张%';SELECT * FROM users WHERE name LIKE '%小张';
不过以 %
为结尾则可以使用索引,如:
SELECT * FROM users WHER<div>本文来源gaodai.ma#com搞#代!码网_</div>E name LIKE '张%';
OR
语句前后没有同时使用索引,比如下面的语句, 字段id
有索引,而 字段name
没有创建索引,那么下面的语句只能全表扫描,无法用到索引:
SELECT * FROM users id = 10 or name='test'复制代码
问题5:MySQL索引底层使用什么数据结构?
在 MySQL
中,大部分情况下,索引都是使用 B-Tree
作为底层数据结构, B-Tree
只是一种泛称,实际上不同的存储引擎使用 B-Tree
时,有不同的变种,比如 InnoDB
使用的是 B+Tree
。
另外也有一些特殊的索引结构,比如哈希索引,哈希索引底层则使用的是哈希表,在 MySQL
中,只有 Memory
存储引擎支持哈希索引。
问题6:什么情况下数据表不适合创建索引?
1 . 对于用于存储归档历史数据的且很少用于查询的数据表,不建议创建索引。
2 . 数据量比较小的数据表,而且未来数据也不会有太大增长的数据,不应该建索引,比如用于保存配置的数据表。
3 . 修改频繁,且修改性能远大于查询性能时,不应该再创建索引。
问题7:什么是回表?
回表是对Innodb存储引擎而言的,在 InnoDB
存储引擎中,主键索引的叶子节点存储的记录的数据,而普通索引的叶子节点存储的主键索引的地点。