必威体育Betway必威体育官网
当前位置:首页 > IT技术

[mysql]SQL语句性能优化--Order by中加DESC慢很多的原因调查与处理

时间:2019-08-18 15:44:30来源:IT技术作者:seo实验室小编阅读:55次「手机版」
 

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_ID

 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建有联合索引

2)性能慢的原因分析

实际上查看执行计划后发现索引没有起作用、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   nrps.t.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语句怎么优化能?有哪个大牛知道的话、请赐教![email protected]

3.关于ORDER BY慢的情况下可以从以下几点进行优化:

1)ORDER BY的字段改到一种表、不要夸表(设计表结构时需注意这一点)

2)OEDER BY字段建索引、多个字段时建联合索引(联合索引的字段顺序要与ORSER BY中的字段顺序一致)

3)ORDER BY中字段中联合索引的所有字段DESC或ASC要统一,否则索引不起作用

4)不要对TEXT字段或者CLOB字段进行排序

4.以下是另一个技术大牛【陈小峰_iefreer】整理的跟ORDER BY有关的知识点

原文地址:https://blog.csdn.net/iefreer/article/details/12622097

相关阅读

Total Recorder去除噪音

下载最新版本,v8.6 Build 6575 下载安装完毕之后用以下注册码激活:用户: Mr N Goldsworthy激活码:TRP6.KSAE.HFGM.NC5H.KAAE.EXXU.RWJ

mysql递归查询

父子查询: 根据父 id 查询下面所有子节点数据;子父查询: 根据子 id 查询上面所有父节点数据;                   

数据库设计工具MySQLWorkBench

   该工具为MySQL官方提供地址:http://dev.mysql.com/downloads/workbench/ 小伙伴们注意按自己的操作系统选择下载版本。 ·

MySQL错误代码大全

转自:https://www.cnblogs.com/JimCalark/p/7808575.html服务器错误代码和消息 服务器错误信息来自下述源文件: 错误消息信息列在s

高性能MySQL】第7章MySQL高级特性 下

7.10全文索引 通过关键字匹配进行查询过滤,基于相似度的查询 有自己独特的语法,没有索引可以工作,有了索引效率更高,全局搜索的索引

分享到:

栏目导航

推荐阅读

热门阅读