SQL语句命中索引,但还是执行很慢

2,392 阅读2分钟

这是我参与8月更文挑战的第8天,活动详情查看:8月更文挑战

慢查询

MySQL的慢查询日志是MySQL提供的一种日志记录,用来记录在MySQL中响应时间超过阀值的语句,具体指运行时间超过long_query_time值(默认值10s)的SQL,则会被记录到慢查询日志中。

慢查询日志中记录的不仅是select语句,update等运行时间超过long_query_time值的SQL,都会被记录到慢查询日志中。

MySQL中,默认慢SQL日志是未开启,需要手动开启

# 查看慢查询日志是否开启
show variables like '%slow_query_log%'

索引

索引是一种特殊的文件,它包含着对数据表里所有记录的引用指针

索引是一种数据结构,数据库索引,能够让我们快速查询、更新数据库表中的数据

索引可以很大提高MYSQL的检索速度

索引类型

  • 存储结构划分

    • BTree索引(B+Tree索引和B-Tree索引)
    • Hash索引:键值对
    • 全文索引:只有MyISAM引擎支持
    • R-Tree索引:支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种,使用比较少
  • 应用层次划分

    • 普通索引:仅加速查询
    • 唯一索引:加速查询 、列值唯一(可以有null)
    • 主键索引:加速查询 、列值唯一(不可以有null),且 表中只有一个
    • 组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
    • 全文索引:对文本的内容进行分词,进行搜索

面试题:命中索引但还是执行慢

首先,我们解答一个问题:使用了索引和是否进入慢查询有没有关系?

没有必然的联系。慢查询是由于执行时间超过了long_query_time值将被记录到慢查询日志中,而导致这个原因可能是网络或者数据库抖动等等其他外部的因素影响。而使用索引是表示一个SQL语句的执行过程。,所以它们之间没有必然的联系。

所以,如果命中索引,但SQL效率仍然慢,其可能原因:

  • 命中的索引可能不是最优的索引,需要重新调整索引的设置
  • 索引字段重复或者空置太多
  • 查询范围太广,形成全索引扫描
  • 没有利用到覆盖索引导致产生回表现象
  • 索引字段数据分布太随机,导致即便没有回表查询但是大量随机IO