MySQL性能优化(七)优化or查询的另一个例子

俊达2年前技术文章936

优化or查询的另外一个例子。

一个例子

SELECT msg.msg_id, msg.content , …
FROM msg 
    LEFT JOIN user ON msg.user_id = user.user_id  
    LEFT JOIN group ON msg.group_id = group.group_id
WHERE msg.gmt_modified >= date_sub('2018-04-29 09:31:44', INTERVAL 30 SECOND)  
     OR user.gmt_modified >= date_sub('2018-04-29 09:31:44', INTERVAL 30 SECOND)  
     OR group.gmt_modified >= date_sub('2018-04-29 09:31:44', INTERVAL 30 SECOND)


业务上只需要查询最近半分钟内有变化的数据。但是由于SQL语句的where条件中,用到了3个表的gmt_modified字段来过滤数据,必须要先将3个表的所有数据都关联出来,然后才能过滤数据,导致查询性能较差。


7-1.jpg


我们将SQL拆分成3个部分:

SQL片段一

SELECT msg.msg_id, msg.content , …
FROM msg 
    LEFT JOIN user ON msg.user_id = user.user_id  
    LEFT JOIN group ON msg.group_id = group.group_id
WHERE msg.gmt_modified >= date_sub('2018-04-29 09:31:44', INTERVAL 30 SECOND)


7-2.jpg

这种情况下,以MSG表作为驱动表,可以先过滤出msg表gmt_modified在半分钟之内的数据,然后再去关联user和group表,大大减少了需要关联的数据。

SQL片段二

SELECT msg.msg_id, msg.content , …
FROM msg 
    LEFT JOIN user ON msg.user_id = user.user_id  
    LEFT JOIN group ON msg.group_id = group.group_id
WHERE user.gmt_modified >= date_sub('2018-04-29 09:31:44', INTERVAL 30 SECOND)

7-3.jpg

类似的,这里可以以user表为驱动表,先过滤user表的数据,再进行关联。

SQL片段三

SELECT msg.msg_id, msg.content , …
FROM msg 
    LEFT JOIN user ON msg.user_id = user.user_id  
    LEFT JOIN group ON msg.group_id = group.group_id
WHERE group.gmt_modified >= date_sub('2018-04-29 09:31:44', INTERVAL 30 SECOND)


7-4.jpg

group表的数据极少变动,所以这个SQL片段基本很少需要执行。


将SQL拆分成3个部分后,优化器可以对这3个SQL片段分别优化,选取不同的表关联顺序。


总结

SQL的写法灵活,表达能力强,但是在一些特定的场景下,我们需要将复杂SQL进行拆分,使优化器可以选择最优的执行计划。


相关文章

企业级大数据安全架构(四)

企业级大数据安全架构(四)

Ranger是支持审计功能的,安装时可以选择审计数据保存的位置,默认支持Solr和HDFS。HDFS的配置比较简单,这里就不赘述了,我们这里使用Ambari默认自带的Solr保存审计日志,下面部署So...

MySQL运维实战之ProxySQL(9.9)proxysql自身高可用

MySQL运维实战之ProxySQL(9.9)proxysql自身高可用

proxysql作为一个程序,本身也可能出现故障。部署proxysql的服务器也肯能出现故障。高可用架构的一个基本原则是消除单点。可以在多个节点上部署proxysql,在proxysql之前再加一层负...

Clickhouse MergeTree原理(二)—— 表和分区的维护

MergeTree是Clickhouse中最核心的存储引擎。上一篇文章中,我们介绍了MergeTree的基本结构。1、MergeTree由分区(partiton)和part组成。2、Part是Merg...

MySQL mgr部署文档

MySQL mgr部署文档

一、环境说明1.1服务器信息1.2目录规划1.2目录规划二、环境配置2.1 关闭防火墙和selinuxservice iptabls stop /etc/selinux/conf...

trino组件对接ldap(二)

trino组件对接ldap(二)

1、coordinater设置证书keytool -genkeypair -validity 36500 -ext SAN=IP:172.16.121.0,DNS:hadoop001  -alias ...

企业Oracle RAC上云闲谈

企业Oracle RAC上云闲谈

随着计算机技术和互联网的不断推进,云计算平台也更加趋于稳定、安全,其显著的性能、方便的资源管理、快捷的应用部署方式越来越为IT业者所接受。目前,云计算已经成为企业数字化转型的重要驱动力。面对基于Ora...

发表评论    

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