MySQLexplain之possible_keys、key及key_len详解

 更新时间:2023年08月07日 16:34:40   作者:昔拉天使  
这篇文章主要介绍了MySQLexplain之possible_keys、key及key_len的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

MySQLexplain之possible_keys、key及key_len

possible_keys

显示可能应用在这张表中的索引,一个或多个。

查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用

key

实际使用的索引。如果为NULL,则没有使用索引

查询中若使用了覆盖索引,则该索引和查询的selet字段重叠,仅出现在key列表中。

覆盖索引:查询的字段与所建索引的字段个数和顺序刚好吻合

key_len

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。

在不损失精确性的情况下,长度越短越好key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的

mysql索引possible_keys,key问题

explain中有两个字段possible_keys,key。

  • possible_keys:表示可能用到的索引。
  • key:实际使用到的索引。

为什么会有单独的两列?

你的where条件中如果使用到了索引列字段,那么possible_keys会列出索引字段对应的索引。

mysql可能会使用到他, 但是要看实际情况,什么是实际情况?

打个比方,如果你有一个按照日期创建的索引列,每天插入一条数据,插入了一年,那么就有365条数据。

这个时候你的搜索条件是查询昨天的数据,sql类似于:

where create_date  > '昨天' 

explain结果如下:

几个关键点:

  • type:range   表示你的sql适合范围查询
  • possible_keys:表示mysql可能会用到的索引(也就是create_date字段对应的索引)。
  • key:实际用到的索引。
  • rows:1   如果查询优化器决定使用全表扫描的方式对某个表执行查询时,执行计划的 rows 列就代表预计需要扫描的行数,如果使用索引来执行查询时,执行计划的 rows 列就代表预计扫描的索引记录行数

因为我们只查昨天的,一天一条数据,所以这里是1。

extra:Using index condition; 表示有些搜索条件中虽然出现了索引列,但却不能使用到索引(这个是不是和possible_keys冲突了?有待验证)

然后我们换一个查询方式,查昨天之前的364天的数据,sql类似如下:

几个关键点:

  • type:all 表示你的sql适合范围查询
  • possible_keys:表示mysql可能会用到的索引(也就是create_date字段对应的索引)。
  • key:实际用到的索引。
  • rows:1041   如果查询优化器决定使用全表扫描的方式对某个表执行查询时,执行计划的 rows 列就代表预计需要扫描的行数,如果使用索引来执行查询时,执行计划的 rows 列就代表预计扫描的索引记录行数

因为我们只查昨天之前的,所以数据量是1041条。

好了,得出的结论就是possible_keys会列出你的where条件中可能会使用到的索引列,但是具体用不到这个索引,是需要根据你的实际情况来的,如果你的条件,使用到索引和不使用到索引所消耗的效果差不错(磁盘io,数据读取等)。

举例来说就是上面的例子,一个条件查询了表中的百分之99的数据,即使你的where条件中使用到了索引(并且使用了正确使用索引的姿势。),那么优化器也会选择放弃使用这个索引,因为你使用了这个索引,还会额外带来回表的代码,那么还不如直接全表扫描。

那么他就会直接放弃使用这个索引,直接进行全表扫描。反之,如果你的数据查询确实是非常的减少磁盘io这些,那么优化器就会使用你这个索引。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • MySQL复合查询和内外连接的操作代码

    MySQL复合查询和内外连接的操作代码

    实际开发中往往数据来自不同的表,所以需要多表查询,但是可以将多张表做笛卡尔积后的表当做是一张表,也就是单表查询,这篇文章主要介绍了MySQL复合查询和内外连接,需要的朋友可以参考下
    2022-09-09
  • 解决mybatis查询结果为null时,值被默认值替换问题

    解决mybatis查询结果为null时,值被默认值替换问题

    这篇文章主要介绍了解决mybatis查询结果为null时,值被默认值替换问题。具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • mysql 月份查询该月有付款的数据

    mysql 月份查询该月有付款的数据

    mysql选择月份查询该月有付款的数据(间隔x月并提前5天付款)
    2010-04-04
  • MySQL中的JSON_CONTAINS函数举例详解

    MySQL中的JSON_CONTAINS函数举例详解

    这篇文章主要给大家介绍了关于MySQL中JSON_CONTAINS函数举例详解的相关资料,MySQL JSON_CONTAINS函数可用于判断JSON数组中是否包含某个元素,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • Navicat连接服务器MySQL数据库步骤及遇到错误和问题

    Navicat连接服务器MySQL数据库步骤及遇到错误和问题

    Navicat是一款强大的数据库管理工具,可以用来远程连接MySQL服务器,下面这篇文章主要给大家介绍了关于Navicat连接服务器MySQL数据库步骤及遇到错误和问题的相关资料,文中通过代码及图文介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • MySQL主从复制延迟原因分析、判断方法与优化方案

    MySQL主从复制延迟原因分析、判断方法与优化方案

    在 MySQL 主从架构的生产环境中,主从复制延迟是最常见、最影响业务稳定性的问题之一,今天我把实战中总结的延迟核心原因、精准判断方法、可落地优化方案全流程整理出来,希望能帮大家彻底搞定主从延迟问题,需要的朋友可以参考下
    2026-03-03
  • 浅谈Mysql使用B+树来实现索引的原因

    浅谈Mysql使用B+树来实现索引的原因

    这篇文章,主要来探讨一下为什么Mysql使用B+树来实现索引,这里讨论的目标是Mysql的InnoDB存储引擎.可以想象一下,如果你是Mysql的开发人员,你会怎么去选择合适的数据结构呢,感兴趣的小伙伴跟着小编一起来探讨吧
    2023-05-05
  • mysql的约束及实例分析

    mysql的约束及实例分析

    这篇文章主要介绍了mysql的约束及实例分析,真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性,需要的朋友可以参考下
    2023-07-07
  • mysql中limit查询踩坑实战记录

    mysql中limit查询踩坑实战记录

    在MySQL中我们常常用order by来进行排序,使用limit来进行分页,下面这篇文章主要给大家介绍了关于mysql中limit查询踩坑的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • 与MSSQL对比学习MYSQL的心得(六)--函数

    与MSSQL对比学习MYSQL的心得(六)--函数

    这一节主要介绍MYSQL里的函数,MYSQL里的函数很多,我这里主要介绍MYSQL里有而SQLSERVER没有的函数
    2014-08-08

最新评论