问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

一条SQL语句执行后如何知道他究竟用了哪些索引

发布网友 发布时间:2022-04-11 10:52

我来回答

2个回答

懂视网 时间:2022-04-11 15:14

来查看,即将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‘

 查询结果

技术图片

 

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

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...语法

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,即使其中的查询条件包含有索引的字段,也会导致索引失效,除非查询条件的字段都带索引(注意:主键自带索引,属于唯一索引的特定类型)

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语句的条件字段是否使用了索引以及跳过索引的几种情况

标签:type   范围查询   oss   stat   alt   失效   creat   inf   state   

热心网友 时间:2022-04-11 12:22

跟踪查看SQL语句的"执行计划"就知道了

例如,mysql下可以用这样方式跟踪:

explain SQL语句~
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
中控是什么意思 抖音直播中控是什么意思 iphone通讯录群组设置 如何更改iphone通讯录拨打电话时总是出现两个称呼 我的电脑是Win8.1update老硬盘有坏道,最近新买了一个硬盘是希捷的1TB混 ... 使命召唤:黑色行动2常见问题 GMA 4500M技术特性 电脑显示器的配置电脑的基本配置有哪些 梦见对象把门钥匙和我分手 梦见对象还我门钥匙要和我分手的预兆 公益性捐赠税前扣除资格 vivo iq00的显示屏是康宁大猩猩玻璃几代? 深圳市讯达通精密科技有限公司怎么样? 麻辣腊肠炒海鲜菇的做法步骤图,怎么做好吃 烟台市华讯精密电子有限公司怎么样? 烟台腾达精密电子有限公司怎么样? 烟台安信精密机械有限公司怎么样? 怎么样从土豆网下载电台节目录音到手机上 在烟台境内的日本企业,大家来说说都有哪些? 烟台路通精密科技股份有限公司怎么样? 如何开展网络营销培训提高员工营销水平? 如何组建一个产品研发部门??? 我喜欢听收音机,电台的节目是否可以下载? 海鲜菇可以用腊肉炒吗 什么软件可以下载电台节目 怎么样提升团队营销能力 作为营销人员怎么提高自己的专业水平,应该看什么书 如何做好营销策划培训? 怎样做好企业营销培训 求《VR虚拟现实:重构用户体验与商业新生态》全文免费下载百度网盘资源,谢谢~ sql中怎么判断是否使用索引语句 烟台富士康有多少人? 货拉拉怎样注册? 烟台市一宏精密铸造机械有限公司怎么样? 海鲜菇炒肉丝怎么炒才好吃? 烟台日特测量仪器有限公司怎么样? 烟台中大精密不锈钢制品有限公司怎么样? 烟台盛泰精密铸造有限公司怎么样? 腊肠海鲜菇炒生菜怎么做 烟台市龙威精密机械设备有限公司怎么样? 烟台吉凯精密机械有限公司怎么样? 烟台耐森特精密齿轮有限公司怎么样? RO净水器用几年后出来越来越小是什原因 车载大屏wifi图标上有个问号 手机显示无线网络已连接,但是无法使用无线网络,通知栏上无线网络图标上有一个问号 英语句what a great museum为什么前面用what开头?请高手指点,谢谢! What a great museum!改成用how开头的。 what a great museum改错 糖醋排骨,怎么加调味道,要炖多长时间 左侧胸壁皮下结节,帮我看看什么情况 What a great museum哪里可以连读