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

俊达1年前技术文章328

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


一个例子

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部署并开启Kerberos配置

安装Kerberosserver节点安装kerberos相关软件yum install -y krb5-server krb5-workstation krb5-libs修改配置文件krb5.conf...

开源大数据集群部署(十五)Zookeeper集群部署

开源大数据集群部署(十五)Zookeeper集群部署

1、集群规划主机版本角色系统用户hd1.dtstack.com3.7.1followerzookeeperhd2.dtstack.com3.7.1leaderzookeeperhd3.dtstack....

ldap安装部署

ldap安装部署

一、关闭selinux和防火墙sed -i 's#SELINUX=enforcing#SELINUX=disabled#g' /etc/selinux/c...

scylladb下线数据中心

1、在要下线的老数据中心所有节点运行数据修复nodetool -h ::FFFF:127.0.0.1 repair -pr2、更改所有业务keyspace的复制策略不在写入老的数据中心--查看所有的k...

Impala 操作命令

Impala 操作命令

Impala的外部shell选项描述-h, --help显示帮助信息-v or --version显示版本信息-i hostname, --impalad=hostname 指定连接运行 impala...

scylladb通过扩缩容节点迁移数据

环境: Scyllsdb版本:4.2一、上线新节点1、确认集群状态和检查配置· 首先确认集群各节点状态是Up Normal (UN),[root@172-16-121-153 scylla]# nod...

发表评论    

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