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及以上,则查询时间会花费十几秒(此表数据近千万)
当时在生产环境中遇到这个问题,比较崩溃.明明是设置了索引的 索引如下
但是却反复试验 就是不行
通过explain发现,2天的执行计划
4天的执行计划
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
问题解决.
其实mysql并不是那么智能,在很多情况下可能会犯浑.有时候 可能需要强制制定索引喊它去查询