mysql索引优化案例

案例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 索引(因为 对字段做了函数操作)

其他方案

  1. 强制索引
  2. 可使用“将待归档的数据” 放入到另一张表
  3.  将待归档的数据 使用redis中sortSet存储

建议:

业务中慎用 order by ,会引起 选错索引

你可能感兴趣的:(mysql,mysql)