[mysql]SQL语句性能优化--Orderby中加DESC慢很多的原因调
查与处理
1. mysql在数据量较⼤的时候、使⽤order by查询结果集时速度很慢的原因可能有以下⼏种:
1) 排序字段不在同⼀张表中
2) 排序字段没有建索引
3)排序字段加DESC后索引没有起作⽤(如何让索引起作⽤才是关键、且听下⽂分解)
4)排序字段中加函数导致索引不起作⽤(这种⼀定要避免、本⽂不对这种情况展开说明)
5)排序字段中含有TEXT或CLOB字段(改成VARCHAR字段)
2. ⽤实例说明排序字段中增加DESC后索引不起作⽤、查询速度很慢
1)例如以下SQL、执⾏起来需要5秒左右、太慢不可接受:
SELECT T.WK_ID, T.WK_NAME, C.CR_CODE, T.AT_BEGIN_TIME, T.WK_BOOK
FROM BO_COPYRIGHT C
INNER JOIN ES_WORKS_INFO T
ON T.CR_ID = C.CR_IDmysql语句顺序
AND C.WK_ID_VALID = T.WK_ID
AND T. DELETEFLAG = 0
ORDER BY T.AT_BEGIN_TIME DESC, T.WK_BOOK
LIMIT 1, 100
其中 ES_WORKS_INFO 的AT_BEGIN_TIME 和WK_BOOK建有联合索引countif函数使用技巧
2)性能慢的原因分析
splitter 1 4实际上查看执⾏计划后发现索引没有起作⽤、Using where; Using filesort。
执⾏计划如下:
SIMPLE t ALL PRIMARY,idx_CR_ID 480006 Using where; Using filesort
SIMPLE c eq_ref PRIMARY,idx_WK_VALID PRIMARY 4 CR_ID 1 Using where
Using filesort。是的,看到它,说明我们的查询需要优化了:⽂件排序是通过相应的排序算法,将取得的数据在内存中进⾏排序。联合索引没有起作⽤。将ORDER BY中的DESC去掉后执⾏完只要0.3秒。那为什么加了DESC后会变慢呢?业务要求必须加上DESC怎么办呢?
先来分析⼀下SQL执⾏慢的底层原因是什么?
我先查了⼀下复合索引的字段顺序和order by中的字段顺序是⼀致的、那为什么还是这么慢呢?为什么还是Using filesort?为什么索引不起作⽤呢?
MySql 索引创建⼿册⾥如是说:
索引列的定义可以跟随 ASC 或者 DESC。这些关键字允许为未来扩展⽤于指定升序或降序索引值存储。这个语法会被解析但却被忽略。索引列总是以升序排列。——也就是说你写了不会报错,但写了⽩写。
这样看来,我们的复合索引没起排序作⽤,原因就在于我们的索引中各字段 asc 存储, order by ⾥ desc 和 asc(默认是 asc) 混⽤。为了验证这个说法,我们把该 order by 各个字段换为⼀致的 desc试试:
SELECT T.WK_ID, T.WK_NAME, C.CR_CODE, T.AT_BEGIN_TIME, T.WK_BOOK
FROM BO_COPYRIGHT C
INNER JOIN ES_WORKS_INFO T
ON T.CR_ID = C.CR_ID
AND C.WK_ID_VALID = T.WK_ID
AND T. DELETEFLAG = 0
ORDER BY T.AT_BEGIN_TIME DESC, T.WK_BOOK DESC
LIMIT 1, 100
果然性能⼀下⼦提⾼了、执⾏时间0.3秒结束。
但是有个遗憾如果业务上必须要求⼀个字段DESC另⼀个字段ASC的话、这个SQL语句怎么优化能?有哪个⼤⽜知道的话、请赐教!szwangdf@163
3.关于ORDER BY慢的情况下可以从以下⼏点进⾏优化:
1)ORDER BY的字段改到⼀种表、不要夸表(设计表结构时需注意这⼀点)
sbas和stacking的区别2)OEDER BY字段建索引、多个字段时建联合索引(联合索引的字段顺序要与ORSER BY中的字段顺序⼀致)
3)ORDER BY中字段中联合索引的所有字段DESC或ASC要统⼀,否则索引不起作⽤
4)不要对TEXT字段或者CLOB字段进⾏排序类固醇对性功能的影响>直方图均衡化去雾算法
4.以下是另⼀个技术⼤⽜【陈⼩峰_iefreer】整理的跟ORDER BY有关的知识点
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论