面试中mysql索引问题的参考答案
大家好,我是码仔小新!微信公众号【码仔小新】,关注可领取技术资料
废话也不多说,一篇文章给你分享我面试总结关于mysql索引的必考题。
原创不易,有帮助的话,欢迎点赞分享啊!
1、什么是索引?
索引是一种数据结构,可以帮我们快速的进行数据的查找。
2、索引的类型有哪些?
主要是BTree索引,hash索引。
3、B+ Tree索引和Hash索引区别?
1、哈希索引适合等值查询,但是无法进行范围查询 ,而B+ Tree叶子节点是以链表连接,可以进行范围查询
2、哈希索引没办法利用索引完成排序
3、如果有大量重复键值的情况下,哈希索引的效率会很低,因为存在哈希碰撞问题
4、B+ 树的特点是什么?为什么不使用二叉树、平衡二叉树、红黑树?
B+ 树是一颗平衡多路查找树,数据都存储在它的叶子节点上,非叶子节点只存储key的信息,这样可以加大非叶子节点存放key的数量,降低树的高度,而且叶子节点使用链表连接,方便进行范围查询。
二叉树、平衡二叉树、红黑树是典型的二叉查找树结构,其查找的时间复杂度O(log2N)与树的深度相关,深度越高,磁盘I/0操作就越多,数据库查找效率越低。
5、聚簇索引跟非聚簇索引的区别?
聚簇索引的叶子节点存储了真实的数据行,不再有另外单独的数据页。
非聚簇索引的叶子节点存储的是索引字段值及指向数据页数据行的逻辑指针,数据存放在另外的文件上。
InnoDB主键索引就是聚簇索引,MyISAM主键索引就是非聚簇索引。
6、什么是最左匹配原则?
在MySQL建立联合索引时会遵守最左前缀匹配原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。
7、什么是覆盖索引?有什么好处?
如果一个索引包含(或者说覆盖)所有需要查询的字段的值,我们就称之为“覆盖索引”。
好处是减少回表。Innodb索引分两种,一种是主键索引,一种是辅助索引。主键索引存储的是索引值和数据行,查找到索引即可将数据返回。而辅助索引存储的是索引值和主键值,需要再通过主键值找到数据行才可返回。但是如果查询的字段已经在索引值上包含了,就可以不用再次通过主键值找数据行了。
8、什么情况下索引会失效?失效会导致什么问题?
1、在where子句中进行null值判断,如:where num is null
2、在where子句中使用 != ,< >这样的符号 如:where num != 1, where num <> 1
3、在where子句中使用 in来判断 如:where num in (1,2)
4、在where子句中使用 or来连接条件 如:where num = 0 or num = 1
5、在where子句中=的左边使用表达式操作或者函数操作,如:where num/2 = 1, where SUBSTRING(name,1,2) = ‘张’
6、 在where子句中使用like模糊查询 如:where name like ‘张’
7、不符合最左匹配原则。
索引失效会导致全表扫描,原来的行锁就升级为表锁。