案例1
select * from order where user_id =11 and status = 1 and id > 10000 limit 10
2个索引 user_id 、 id
场景
偶然会查询的慢,且不容易复现
原因
id大的时候,mysql评估后使用id更快;但是实际上会多几次IO查询
(总共1000W条数据,>999.9W,limit 从倒数1000条查询。。假如这1000条只有最后1条是复核条件的,那么:就会从磁盘扫描出这1000条数据,然后比较user_id。 假如10条数据是1个page, 1000条数据要100个page,也就是100次磁盘IO,因此使用id索引会慢)
解决方案
强制使用 user_id 索引
案例2
查询未归档的订单(未归档的数据量,因此status创建了索引能有效筛选出数据)
select * from order where status =10 order by update_time
索引
2个索引 status , update_time
问题
使用 update_time 索引,能避免排序;但是,会增加磁盘IO
解决方案
select * from order where status =10 order by update_time+0
update_time +0 后,就无法利用 update_time 索引(因为 对字段做了函数操作)
其他方案
- 强制索引
- 可使用“将待归档的数据” 放入到另一张表
- 将待归档的数据 使用redis中sortSet存储
建议:
业务中慎用 order by ,会引起 选错索引