mysql 强制使用索引 解决不走索引的全表遍历

mysql在某些查询中 会显得非常不智能 导致走了较大的坑 详情如下:

SELECT posChargeData.id,cardNumber,entranceDate,posId,exitDate,url,operatorId
FROM posChargeData  WHERE parkId=433  AND entranceDate > DATE_SUB(NOW(), INTERVAL 2 DAY)  
AND cardNumber='渝C76111' ORDER BY id DESC LIMIT 1

在这个sql语句中 如果 DATE_SUB(NOW(), INTERVAL 2 DAY) 改为3day及以上,则查询时间会花费十几秒(此表数据近千万)
当时在生产环境中遇到这个问题,比较崩溃.明明是设置了索引的 索引如下


image.png

但是却反复试验 就是不行
通过explain发现,2天的执行计划


image.png

4天的执行计划
image.png

4天的执行计划中,mysql的内部策略居然没有走索引!!

解决办法:
强制在查询中 走索引 并制定索引名

SELECT posChargeData.id,cardNumber,entranceDate,posId,exitDate,url,operatorId
FROM posChargeData FORCE INDEX(parkId_2) WHERE parkId=433  AND entranceDate > DATE_SUB(NOW(), INTERVAL 2 DAY)  
AND cardNumber='渝C76111' ORDER BY id DESC LIMIT 1

问题解决.


image.png

其实mysql并不是那么智能,在很多情况下可能会犯浑.有时候 可能需要强制制定索引喊它去查询

你可能感兴趣的:(mysql 强制使用索引 解决不走索引的全表遍历)