MySQL索引相关面试题问答总结

面试官: 什么是索引?

答:嗯~ 索引在项目中是比较常见的,就像是我们书本的目录一样,它是一种帮助MySQL高效的查询数据的数据结构,主要作用就是提高数据检索的效率(想象一下通过目录查询章节),通过使用索引可以降低数据库查询的I/O成本,索引也可以对数据进行排序,适合范围查询,降低数据查询成本,从而降低CPU的消耗。

面试官:索引的底层数据结构了解过吗?

答:索引的底层数据结构有B+Tree 索引、HASH 索引、Full-Text 索引,其中MySQl默认的存储引擎InnoDB的默认数据结构是B+树来存储索引,因为B+有很多的优点适合用于索引:

  1. 不像二叉树一样,B+树每一层可以存放更多的结点,这导致存放相同的数据路径更短。
  2. 因为非叶子节点只存储指针,叶子节点存储数据,导致磁盘读取B+树的代价更低。
  3. 因为在最底层B+树是按照顺序存放的,并且使用了双向链表,更加方便扫库和进行区间查询。

面试官:B树和B+树的区别是什么呢?

简单回答:

  • 在B树中叶子结点和非叶子结点都会存放数据,而B+树所有的数据都存放在叶子结点,在查询的时候B+树的表现更加稳定(因为B树有时候可以在O(1)找到)。
  • 叶子节点构成了一个有序链表,更加适合范围查询。

面试官:什么是聚簇索引和非聚簇索引?

好的~

  • 聚簇索引主要是指数据与索引放到一块,B+树的叶子节点保存了整行数据,有且只有一个,一般情况下主键在作为聚簇索引的
  • 非聚簇索引值的是数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个,一般我们自己定义的索引都是非聚簇索引(查找数据需要回表)

面试官:知道什么是回表查询嘛 ?

嗯,其实跟刚才介绍的聚簇索引和非聚簇索引是有关系的,回表的意思就是通过二级索引找到对应的主键值,然后再通过主键值找到聚集索引中所对应的整行数据,这个过程就是回表。(如果面试官直接问回表:需要可以结合聚簇索引和非聚簇索引)

面试官:知道什么叫覆盖索引嘛 ?

覆盖索引是指select查询语句使用了索引,并且在返回的列中,在索引中全部能够找到,例如:如果我们使用id查询,它会直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。
如果按照二级索引查询数据的时候,返回的列中没有创建索引,有可能会触发回表查询,尽量避免使用select *,尽量在返回的列中都包含添加索引的字段。

面试官:索引创建原则有哪些?

嗯,这个情况有很多,不过都有一个大前提,就是表中的数据要超过10万以上,我们才会创建索引,并且添加索引的字段是查询比较频繁的字段,一般也是像作为查询条件,排序字段或分组的字段这些。
还有就是,我们通常创建索引的时候都是使用复合索引来创建,一条sql的返回值,尽量使用覆盖索引,如果字段的区分度不高的话,我们也会把它放在组合索引后面的字段。
如果某一个字段的内容较长,我们会考虑使用前缀索引来使用,当然并不是所有的字段都要添加索引,这个索引的数量也要控制,因为添加索引也会导致新增修改的速度变慢。

面试官:什么情况下索引会失效 ?

嗯,这个情况比较多,我说一些自己的经验,以前遇到过的

比如,索引在使用的时候没有遵循最左匹配法则,第二个是,模糊查询,如果%号在前面也会导致索引失效。如果在添加索引的字段上进行了运算操作或者类型转换也都会导致索引失效。

我们之前还遇到过一个就是,如果使用了复合索引,中间使用了范围查询,右边的条件索引也会失效

所以,通常情况下,想要判断出这条sql是否有索引失效的情况,可以使用explain执行计划来分析

面试官:sql的优化的经验

sql优化的话,我们会从这几方面考虑,比如:
建表的时候、使用索引、sql语句的编写、主从复制,读写分离,还有一个是如果量比较大的话,可以考虑分库分表

  • 创建表的时候:我们需要结合字段的内容选择合适的数据类型,比如数值的话采用:tinyint、int 、bigint,如何是字符串选择char和varchar或者text类型。
  • 比如SELECT语句务必指明字段名称,不要直接使用select * ,还有就是要注意SQL语句避免造成索引失效的写法;如果是聚合查询,尽量用union all代替union ,union会多一次过滤,效率比较低;如果是表关联的话,尽量使用innerjoin ,不要使用用left join right join,如必须使用 一定要以小表为驱动。

参考资料主要黑马视频:

  • 25
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值