MySQL性能优化(二)优化排序操作

俊达3年前技术文章830

排序是数据库的基本功能。


一个例子

SELECT *
FROM audit_log 
WHERE user_id = xxx
AND log_type = ‘xxxx’
ORDER BY gmt_create DESC


执行计划

2-1.png


看这里的执行计划:

key: idx_userid_logtype。使用了idx_userid_logtype索引。

key_len: 8。user_id为bigint

ref: const。

Extra: Using where; Using filesort。因为SQL中用到了order by,这里使用了filesort。


排序是一个耗资源的操作,需要消耗CPU和内存资源。如果需要排序的数据量超过了排序内存,需要将数据写入磁盘文件,进行多趟排序。

在上面这个例子中,我们可以利用索引的有序性来避免排序。这也是优化排序SQL的一个常用的方法。


使用索引消除排序

alter table audit_log
   drop key idx_userid_logtype,
   add KEY `idx_userid_logtype` (`user_id`,`log_type`,`gmt_create`)


我们在索引中加入gmt_create字段,再查看执行计划:


2-2.png


可以看到,Extra中没有了filesort相关内容。


前提条件

使用索引消除排序有几个前提条件:

1、排序字段前面的字段(这里是user_id, log_type),都需要以等值条件传入到where条件中(user_id=xx and log_type=xx)。

2、如果根据多个字段排序( order by col_1, col_2),则索引中相关字段也要以同样的顺序( index idx(col_1, col_2)



对于上述索引(user_id, log_type, gmt_create),下面的SQL就无法使用索引来消除排序。还是需要filesort。

SELECT *
FROM audit_log 
WHERE user_id = xxx
ORDER BY gmt_create DESC



相关文章

Kubernetes日志收集

Kubernetes日志收集

关于容器日志Docker的日志分为两类,一类是Docker引擎日志;另一类是容器日志。引擎日志一般都交给了系统日志,不同的操作系统会放在不同的位置。本文主要介绍容器日志,容器日志可以理解是运行在容器内...

bind服务-2

bind服务-2

五、部署一个正向解析5.1)教学案例对zutuanxue.com域名做解析,解析要求如下:www 解析为A记录 IP地址为 192.168.11.88news 做别名解析CNAME 解析为 www1)...

通过SDK上传oss文件报错“413 Request Entity Too Large”

通过SDK上传oss文件报错“413 Request Entity Too Large”

问题描述通过SDK上传oss文件返回错误如下,客户反馈上传的文件不大,只有200M。浏览器端访问返回504 timeout报错,同客户核实是每次到1min 30s时候上传大文件会报错com.aliyu...

FLink-Canal

canal formatCanal 是一个 CDC(ChangeLog Data Capture,变更日志数据捕获)工具,可以实时地将 MySQL 变更传输到其他系统。Canal 为变更日志提供了统一...

借助arthas工具打火焰图

借助arthas工具打火焰图

1、下载arthas在命令行下面执行(使用和目标进程一致的用户启动,否则可能 attach 失败):curl -O https://arthas.aliyun.com/arthas-boot.jar...

ES运维(三)架构与规划(阿里云)

ES运维(三)架构与规划(阿里云)

1、 阿里云Elasticsearch架构图阿⾥云Elasticsearch和Kibana容器化运⾏在ECS中,监控agent(独⽴进程)负责收集监控指标,通过SLS发送给云监控完成监控报警。实例之间...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。