如何查询sql语句的条件字段是否使用了索引以及跳过索引的几种情况[通俗易懂]

如何查询sql语句的条件字段是否使用了索引以及跳过索引的几种情况[通俗易懂] 今天执行通过时间范围查询订单数量的sql时,想看看该时间字段是否走了索引,发现一个很有意思的问题. 首先说一下查询是否使用了索引的方法 通过explain来查看,即将explain放在查询的…

	如何查询sql语句的条件字段是否使用了索引以及跳过索引的几种情况[数据库教程]

今天执行通过时间范围查询订单数量的sql时,想看看该时间字段是否走了索引,发现一个很有意思的问题.

首先说一下查询是否使用了索引的方法

通过explain来查看,即将explain放在查询的sql前面

explain SELECT * from ord_order_consume where create_time > 2020-04-01 00:00:00 and create_time < 2020-07-23 23:59:59

代码100分

 查询结果

技术图片

 

 主要说明一下红框里边字段的含义

table: sql所查询的表名

type: 结果值从好到坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题

possible_keys: sql可能用到的索引

key: sql实际用到的索引,如果是Null,说明没有用到索引

rows: MySQL认为执行查询时必须检查的行数

 

这里有一个有意思的问题,那就是其实我的表里边create_time字段是加了索引的,但可以看到type=ALL,说明没有使用到索引,这是为什么呢?

开始我以为是< >符号的问题,因为我看一篇博客上说,sql语句使用< >符号,会导致全部搜索,于是我改用between…and…语法

代码100分explain SELECT * from ord_order_consume where create_time between 2020-04-01 00:00:00 and 2020-07-23 23:59:59

查询结果

技术图片

 

 发现type仍然是ALL,没有使用索引,说明这里跟< >符号没有关系

但是,当我将日期范围调小之后

explain SELECT * from ord_order_consume where create_time > 2020-06-01 00:00:00 and create_time < 2020-07-23 23:59:59

查询结果

技术图片

 

 发现type变为了range,并且key也有索引的名称,说明使用了索引

由此得出结论

当时间类型的字段存在索引时,索引是否使用与查询到的数量大小有关

查询到的数量大,不使用索引;

查询到的数量小,使用索引;

至于这个数量是什么范围,好像是有一个比例.不过我大致测了一下,如果查询结果在两万左右,会使用索引,再大就不再使用索引了(这里仅做参考)

 

那么,导致sql语句跳过索引,直接全表搜索的情况还有哪些呢?这里简单做个总结

1.where条件查询语句带or,只要带or,即使其中的查询条件包含有索引的字段,也会导致索引失效,除非查询条件的字段都带索引(注意:主键自带索引,属于唯一索引的特定类型)

代码100分explain select * from ord_order_consume where user_id = 1349813 or buss_type = 2

结果

技术图片

2.对于复合索引,如果查询条件不是第一个索引字段,那么不会使用索引

技术图片

explain select * from ord_order_consume where create_time = 2020-06-01 00:00:00

结果

技术图片

 

 

explain select * from ord_order_consume where order_state = 20

结果

技术图片

3.like模糊查询,%在左边(查了不少资料,说%在右边不会导致索引失效,但我实践了一下,发现也失效了,具体原因有待进一步研究)

explain select * from ord_order_consume where stake_no like %1

结果

技术图片

 

 

4.where查询条件字段如果是varchar类型,必须用引号引起来,否则索引失效

explain select * from ord_order_consume where stake_no  = 1140290000001466

技术图片

 

 

 select * from ord_order_consume where stake_no = 1140290000001466

技术图片

 

如何查询sql语句的条件字段是否使用了索引以及跳过索引的几种情况

原文地址:https://www.cnblogs.com/ubiquitousShare/p/13373089.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7102.html

(0)
上一篇 2023-03-27
下一篇 2023-03-27

相关推荐

  • Python判断对象类型的方法总结

    Python判断对象类型的方法总结 Python是一种高级编程语言,它在数据科学、机器学习和人工智能等领域广泛使用。在Python编程中,判断对象类型是基本的操作之一,可以帮助程序员更好地理解和操作数据。本文将从多个方面对Python中判断对象类型的方法进行总结和详细阐述,以帮助读者更好地掌握Python编程的技能。

    2024-06-24
    38
  • 使用 SQL 服务器时,”评估期已过期”错误消息[通俗易懂]

    使用 SQL 服务器时,”评估期已过期”错误消息[通俗易懂]当打开sql server2008企业管理器的时候,出现报错“评估期已过。有关如何升级的测试版软件的信息…..” 修改注册表:HKEY_LOCAL_MACHINE/SOFTWARE/Microso

    2022-12-26
    167
  • Python检查库版本的方法

    Python检查库版本的方法在python中,我们经常需要使用各种各样的库或者第三方模块来实现自己的功能。而这些库的版本是不断更新的,为了避免出现一些不必要的错误或者是兼容性问题,我们需要对这些库的版本进行检查。br
    本文将从多个方面详细阐述Python检查库版本的方法。

    2024-05-04
    60
  • mysql 8.0 忘记root密码后重置[通俗易懂]

    mysql 8.0 忘记root密码后重置[通俗易懂]最近状态很不好,一直晕晕晕晕晕晕乎乎的,一个测试实例,下班前修改了一下root的密码,接着就下班走人,第二天来发现root密码忘了 刚好自动化安装脚本整理好了,本来想着算了直接重装实例得了,简单省事也

    2022-12-22
    144
  • 如何干涉MySQL优化器使用hash join[亲测有效]

    如何干涉MySQL优化器使用hash join[亲测有效]GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源。 GreatSQL是MySQL的国产分支版本,使用上与MySQL一致。 前言 实验 总结 前言 数据库的优化器相当于人类的大

    2023-06-05
    135
  • mysql8授权root用户远程登陆[通俗易懂]

    mysql8授权root用户远程登陆[通俗易懂]网上找了一大堆资料,看了半天都不行。 正确的方式是这种 update user set host='%' where user='root'; flush p…

    2023-03-10
    140
  • 初学Redis(二)–安装Redis[亲测有效]

    初学Redis(二)–安装Redis[亲测有效]1. 下载 redis官网支持Linux版本,微软维护windows版本 redis官网,可以下载linux版本 https://redis.io/ windows版本 https://github…

    2023-02-22
    161
  • 用Python编写简单易用的GUI界面

    用Python编写简单易用的GUI界面Python自带的tkinter库是一种常用的创建图形用户界面(GUI)的工具,它可以在Windows、Linux和Mac OS等多个操作系统上使用。然而,它的使用方法并不像其他Python库那么简单,需要有一些基本的GUI编程知识。

    2024-03-30
    87

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注