【MySQL系列】一条SQL,我怎么知道它有没使用到索引?

  • 👉以贴近现实的【面试官面试】形式帮助你系统学习后端技术
  • 📚本期博客为《MySQL系列》
  • 创作不易,不妨点赞、收藏、关注支持一下
  • 🔥博客内容持续产出以下系列
    • 《Redis系列》
    • 《MySQL系列》
    • 《Kafka系列》
    • 《ZooKeeper系列》
    • 《多线程系列》
    • 《JVM系列》

1. 索引类型

面试官:知道索引有什么类型吗?

知道的,我了解的主要有B树索引、哈希索引。

面试官思考中...

1.1 B-Tree索引

面试官:B树索引说一下?

好的面试官。

  1. 结构方面 ,B-Tree不同于二叉搜索树,它是多子树的
  2. 值的存储方面,所有的值都存储在叶子节点,且叶子节点可以存储多个值
  3. 另外叶子节点之间用指针链接形成双向链表 。如果是二级索引建立的B-Tree,每个叶子节点的值有保存对应行数据的主键

面试官思考中...

1.2 B-Tree值的存储

面试官:你说值都存储在叶子节点,那有什么好处?

嗯有两方面。

值都存储在叶子节点,使得非叶子节点层数更少 ,整棵B-Tree的高度变得矮胖,可以提高搜索的效率

另外业务上一般都是范围查询,值都存储叶子节点同时形成双向链表,很适合范围查询。

面试官思考中...

1.3 哈希索引

面试官:知道为什么主流数据库引擎不采用哈希索引吗?

hhh就像我刚刚说的,业务上一般都是范围查询,而哈希索引不支持任何范围查询。

哈希索引会为所有的索引列计算一个哈希码,在哈希表中保存哈希码和指向每个数据行的指针,这种结构对精确匹配查询效率才高。

面试官思考中...

2. 聚簇索引

面试官:聚簇索引和二级索引有什么关联?

好的面试官。

是这样的,二级索引指的是非主键索引 ,它的叶子节点保存的只是行的主键值,所以需要通过主键来找到行数据。

而聚簇索引是通过主键来建树 ,叶子节点包含了行的全部数据,主键索引就是聚簇索引。

所以通过二级索引查找行 ,需要先在二级索引建立的B-Tree上找到主键值,再从聚簇索引建立的B-Tree找到行数据。

面试官思考中...

3. 索引效率

面试官:那我一条SQL,我怎么知道它有没使用到索引?

可以使用Explain关键字 来分析,它会模拟执行sql语句,查询出sql语句执行的相关信息,如哪些索引可以被命中、哪些索引实际被命中。

我说下Explain查询结果的几个关键字段。

  • type

    • cost:通过索引一次查询
    • ref:使用到索引
    • range: 使用到索引
    • all:全表扫描
  • Extra

    • using filesort:使用外部文件排序,发生在无法使用索引的情况下

    • using index:where查询 的列索引覆盖,直接通过索引就可以查询到数据

    • using where:where查询 的列,没有全部被索引覆盖

    • using join buffer:使用了连接缓存

  • possible_key

    表示可以使用的索引

  • key

    表示实际使用的索引

3.1 索引失效情况

面试官:有没索引失效的情况呢?

有的,索引失效一般是这个SQL查询破坏了使用B-Tree查询的条件。

  • 对索引列进行数学函数处理的话,索引会失效

  • 索引是字符串类型,查询值没有添加单引号 ''那索引会失效。因为值类型与索引列类型不一致,MySQL不会使用 索引,而是把索引列数据进行类型转换后进行查询

  • 对索引列进行模糊查询,%要放在最右侧,否则索引失效

    sql 复制代码
    SELECT * FROM user WHERE name LIKE n%
  • 组合索引,前一个索引使用范围查询,后面的索引也会失效

大概是这些情况。

面试官抓抓脑袋,继续看你的简历......

得想想考点你不懂的😰

未完待续。。。

好了,今天的分享就先到这,我们下期《MySQL系列》继续。

创作不易,不妨点赞、收藏、关注支持一下,各位的支持就是我创作的最大动力❤️

相关推荐
tan180°5 小时前
MySQL表的操作(3)
linux·数据库·c++·vscode·后端·mysql
DuelCode6 小时前
Windows VMWare Centos Docker部署Springboot 应用实现文件上传返回文件http链接
java·spring boot·mysql·nginx·docker·centos·mybatis
优创学社26 小时前
基于springboot的社区生鲜团购系统
java·spring boot·后端
why技术6 小时前
Stack Overflow,轰然倒下!
前端·人工智能·后端
幽络源小助理6 小时前
SpringBoot基于Mysql的商业辅助决策系统设计与实现
java·vue.js·spring boot·后端·mysql·spring
ai小鬼头7 小时前
AIStarter如何助力用户与创作者?Stable Diffusion一键管理教程!
后端·架构·github
简佐义的博客7 小时前
破解非模式物种GO/KEGG注释难题
开发语言·数据库·后端·oracle·golang
爬山算法7 小时前
MySQL(116)如何监控负载均衡状态?
数据库·mysql·负载均衡
Code blocks8 小时前
使用Jenkins完成springboot项目快速更新
java·运维·spring boot·后端·jenkins