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

俊达2年前技术文章629

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


一个例子

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



相关文章

kafka高可靠性相关配置

kafka高可靠性相关配置

为保证高可靠可以通过以下方面进行设置:1) 物理机器场景配置项配置说明高可靠高性能不间断电源配置,防止服务器异常断电RAID卡电池配置,防止服务器异常断电RAID卡写缓存开启,提高性能RAID 1配置...

查看相关服务器信息命令

查看相关服务器信息命令

1、查看服务器架构方式arch2、查看服务器cpu核数nproc3、查看服务器内存大小free -hdmidecode -t 17 | grep Size4、查看某目录下挂载磁盘大小lsblk5、查看...

Python 实现 Prometheus 自定义指标暴露

Python 实现 Prometheus 自定义指标暴露

虽然 Prometheus 已经拥有可直接使用的 exporter 可供使用,以满足收集不同的监控指标的需要。然而,如果我们需要收集一些自定义指标项,还是需要我们编写程序去暴露相关接口(/metric...

kafka常见配置参数解析

broker.idbroker 的全局唯一编号,不能重复,只能是数字num.network.threads=3处理网络请求的线程数量num.io.threads=8用来处理磁盘 IO 的线程数量soc...

Linux】项目自动化构建工具-make/Makefile 详解

Linux】项目自动化构建工具-make/Makefile 详解

 在Linux及类Unix系统中,自动化构建项目是提高开发效率、减少重复劳动的关键环节。make工具及其配置文件Makefile是实现这一目标的重要工具组合。它们通过定义一系列规则和依赖关系,自动执行...

MySQL基本配置文件

MySQL基本配置文件

# 5.7  # mkdir /data/mysql57/{data,logs,run} -pv [client] port ...

发表评论    

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