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

3次阅读

共计 372 个字符,预计需要花费 1 分钟才能阅读完成。

起因

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

排查过程

第一步

create_time 是范畴查问,当范畴比拟小时,发现竟然应用了 create_time 索引。

第二步

根本确定是 mysql 优化器的策略问题了,然而他策略到底是怎么样的呢?关上官网,找到 where 优化策略,有一段这样写的:

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

正文完
 0