随笔 - 195  文章 - 3  评论 - 36  阅读 - 63万

MySQL数据库order by 奇慢无比

今天遇到个奇葩的问题,

sql 数据量很大 有where 和order by,不加order by 速度很快,加了就很慢

 

一、首先我们对这条sql执行查询计划:

 explain select t.order_id from book_order t  ORDER BY t.order_id desc 

 

 

explain select t.order_id from book_order t 

 

 

 

 

这条语句应用的索引是idx_bo_order_book_local

 

 

进一步确定,再对使用where条件后,索引变成了主键。

explain select t.order_id from book_order t where t.order_id = 1593539

 

 

通过以上的情况可以看出:

MySQL默认的查询(没有where条件),不一定使用主键,由于MySQL的每一条简单查询只应用一个索引,所以,这个时候使用order by 主键,主键的索引功能失效。

 

二:解决办法

1、order by 索引(where条件中引用的索引)。

2、强制使用主键:FORCE INDEX(PRI),如果想强制使用索引,则用FORCE INDEX(索引名)。

 explain select t.order_id from book_order t FORCE INDEX(idx_bo_order_book_local) ORDER BY t.order_id desc;

 

 三、其他order by 索引失效的原因分析

 

1、MySQL每天一条简单语句只应用一个索引,所以order by的字段要在索引之中,并且和where条件可以合并成组合索引。

 

2、select的字段,必须是索引字段。(主键查询除外)

 

3、如果sql语句为复合语句,包含子查询等,可以把语句分解成简单查询来分析。

 

posted on   一只阿木木  阅读(26129)  评论(0编辑  收藏  举报
编辑推荐:
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8

点击右上角即可分享
微信分享提示