mysql索引优化案例

2023-12-21 00:02:47

案例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 ,会引起 选错索引

文章来源:https://blog.csdn.net/Draymond_feng/article/details/135118514
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。