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

俊达3年前技术文章871

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


一个例子

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



相关文章

flume开启jmx加入grafana

部署flume_exporter需要go环境编译配置go环境首先下载go安装包Linux:https://golang.google.cn/dl/解压、添加环境变量tar -zxvf go*.tar....

scylladb简单命令介绍

一、cql 命令查看版本SHOW VERSION查看连接的数据库地址SHOW HOST批量执行.cql文件中的命令SOURCE '/home/thobbs/commands.cql'开启和关闭命令追踪...

大数据集群部署规划(二)硬件配置要求

CPU(虚拟机建议配置*2)X86服务器:最低配置:双路4核Intel处理器。推荐配置:双路8核Intel处理器。ARM服务器:双路32核ARM处理器Bit-mode64位内存(虚拟机不建议超分)物理...

RDS通过DMS管理登录处理

RDS通过DMS管理登录处理

问题描述无法通过DMS管理登录进入数据库,报错如下:问题处理方式一在RDS控制台新建账号 账号管理--创建账号将此数据库添加进DMS在DMS控制台--数据库实例--新增实例将新建的数据库账号信息进行录...

数据湖技术之iceberg(四)iceberg的数据类型

1  Iceberg数据类型类型描述笔记boolean布尔类型,true或者falseint32 位有符号整数可以转换成long类型long64 位有符号整数float单精度浮点型可以转换成...

ES运维(八)添加IK分词器

ES运维(八)添加IK分词器

一、概述ES自带standard analyzer、simple analyzer、whitespace analyzer、stop analyzer、language analyzer、patter...

发表评论    

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