登录
首页 >  数据库 >  MySQL

记一次范围查询命中索引却没有使用索引的事件

来源:SegmentFault

时间:2023-01-13 17:58:45 138浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《记一次范围查询命中索引却没有使用索引的事件》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下MySQL、Java,希望所有认真读完的童鞋们,都有实质性的提高。

起因

生产环境订单主表有两个普通索引create_time和debts_notify_num,当使用这两个条件进行筛选,这两个索引都命中,但却只使用了debts_notify_num,导致查询列变多,查询变慢。看上去就像是“命中了索引反而查询速度更慢”。

排查过程

第一步

create_time是范围查询,当范围比较小时,发现居然使用了create_time索引。

image.png

image.png

第二步

基本确定是mysql优化器的策略问题了,但是他策略到底是怎么样的呢?打开官网,找到where优化策略,有一段这样写的:

image.png

翻译一下就是说:MySQL的优化器每次会判断到底是走索引查询比较快还是全表扫描比较快,原来的判断是如果索引查询筛选的列超过总表的30%,就走全表索引。但是现在优化器没有那么low了,不这么判断了,人有更多的条件判断是否走全表查询,比如:表大小,行数和I/O块大小

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于数据库的相关知识,也可关注golang学习网公众号。

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表