Mysql DATE_SUB索引问题是否生效?

最近做个功能遇到一个问题,在一张大概有一千万数据的表中,查询一个月内的数据,有其他筛选条件.
SQL从稍微复杂一点的聚合SQL(包括,Max,Group by,Sum)更改了一个简单的查询SQL.所有的聚合在代码中实现.但是查询结果还是比较慢,并且是在将where条件分片之后.
更改前的SQL就不放了.直接放更改后的:

EXPLAIN 
SELECT a_cloumn AS aId FROM a_table
WHERE update_time between DATE_SUB(CURDATE(), INTERVAL 30 DAY) AND NOW() 
AND `status` = 1
AND a_cloumn IN (
    1,2,3,4,5,6,7.....#(之前是500个,后来分批查了,更改为了100个一组)
)

update_time字段是datetime类型.
其中,表中的索引包括了普通索引:

  1. a_cloumn_idx
  2. a_b_cloumn_idx(b字段不在本次查询中使用)
  3. update_time_idx
  4. time_sta_sid_cid_idx(新创建,为了本次查询)
    在查询的时候,执行计划中无论如何也命中不了新建索引,每次都是命中索引 2.

就很奇怪,为什么不遵守最左索引,而且就算第一个命中也应该命中时间索引吧.
但是在查询资料的时候,有资料分析,在选择索引的时候,会根据查询结果来选择索引的使用.
一直无果.
之前也有怀疑过DATE_SUB不走索引,但是这个SQL在测试环境使用是OK的,正式环境和测试环境的MYSQL版本一致,SQL的执行计划结果也是完全命中SQL,但是正式环境就不行,索引一直执行的是错误的.
两者的区别是一个是用的Navicat一个使用的阿里云的DMS.

多次修复无果,一直有慢SQL的报警,遂尝试将between的时间格式更改为完整的时间戳,在正式环境竟然OK了,命中了新索引.但是在测试环境竟然命中了索引 3 .
更改后的SQL:

EXPLAIN 
SELECT a_cloumn AS aId FROM a_table
WHERE update_time between'2020-10-24 16:32:24' AND '2020-10-24 16:32:24' 
AND `status` = 1
AND a_cloumn IN (
 1,2,3,4,5,6,7.....#(之前是500个,后来分批查了,更改为了100个一组)
)

裂开了.
先暂时解决了线上的问题吧.
所以,关于DATE_SUB索引时间字段是否生效,我也搞不清楚了.
有比较了解的同学,可以在评论区讲解下,不胜感激.

后续:
范围查找会使索引失效,现在将索引更改为了
idx_a_cloumn_status_update_time,待验证…

你可能感兴趣的:(随笔,java,mysql,数据库)