【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系列》继续。

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

相关推荐
㳺三才人子3 小时前
初探 Flask
后端·python·flask·html
星栈独行3 小时前
我在 Rust 全栈项目里用 JWT 做无状态认证
开发语言·后端·rust·前端框架·开源·github·web
Java爱好狂.4 小时前
Java程序员体系化学习路线(2026最新版)
java·后端·java面试·java架构师·java程序员·java八股文·java学习路线
陈随易4 小时前
Redis 8.8发布,一定要更新
前端·后端·程序员
装不满的克莱因瓶4 小时前
SpringBoot 如何将 lib 目录中jar包打包进最终的jar包里面
spring boot·后端·maven·jar·mvn
IronMurphy5 小时前
MySQL拷打第二讲
数据库·mysql
ltl5 小时前
Transformer 原论文实验结果:为什么 28.4 BLEU 足以改写路线图
后端
excel6 小时前
为什么我推荐使用 Termius:现代 SSH 工具的完整体验
前端·后端
卷毛的技术笔记6 小时前
Java后端硬核实战:用Spring AI Alibaba+Redis给LLM装上“超强记忆中枢”
java·人工智能·redis·后端·spring·ai·系统架构
裴东青7 小时前
ProxySQL实现MySQL主从集群的读写分离
数据库·mysql·adb