MySQL性能优化(六)优化or条件

俊达1年前技术文章677

优化器是数据库中非常核心,又非常复杂的一个组件。有的SQL,优化器选择的执行计划并不是最优的,通过改写SQL,可以帮助优化器找到最优的执行计划。

where条件中的or子句,是比较容易出问题的一个场景。

一个例子

SELECT count(1)
FROM car
WHERE is_deleted = 0 AND car_id NOT IN (  
    SELECT car_id FROM product WHERE product_type = 2 AND source = 2)
AND (seller_id = 100 
     OR (creator = 200 AND seller_id = -1))


执行计划

6-1.jpg


上面的SQL中,过滤性好的2个条件seller_id=100和creator = 200使用OR,

分别使用seller_id=100和creator=200过滤数据,再把数据和并起来,比单走seller_id的索引效果好。

mysql支持index_merge的执行计划。但是上面这个例子只用到了seller_id的索引。而seller_id=-1的过滤性差,从执行计划中也可以看到,car表的rows是16万,比较高。


这种情况下,默认的执行计划不够好,我们可以对SQL做一个小小的改造,改成这种形式:

 SELECT sum(a) FROM (
    SELECT count(1) as a FROM car WHERE is_deleted = 0 AND car_id NOT IN ( SELECT car_id  FROM product WHERE product_type = 2 AND source = 2)  
AND (seller_id = 100)    
    union all     
    SELECT count(1) as a FROM car WHERE is_deleted = 0 AND car_id NOT IN (SELECT car_id  FROM product WHERE product_type = 2 AND source = 2)
AND creator = 1000  AND seller_id = -1
) t


查看执行计划:

6-2.png


改写之后,union的2个SQL片段分别使用了2个不同的索引,扫描的行数分别是1238和7130,比改写之前的扫描16万行记录提升了一个数量级。


总结

虽然数据库的优化器非常强大,但是在有的场景下,改写SQL能帮助优化器更好地优化查询语句。也能让执行计划更稳定。



相关文章

Mac安装Hadoop文档-保姆级操作(二)

Mac安装Hadoop文档-保姆级操作(二)

配置hadoop进入hadoop的目录:cd /opt/homebrew/Cellar/hadoop/3.3.6/libexec/etc/hadoop修改core-site.xml<config...

kafka开启kerberos和ACL

kafka开启kerberos和ACL

kafka开启kerberos和ACL一、部署kafka-KB包1.上传软件包依次点击 部署中心----部署组件----上传软件包选择需要升级的kafka版本并点击确定 2.部署kafka依次点击部署...

hive创建hbase映射表

hive创建hbase映射表

hbase创建表,导入数据/opt/app/hbase-2.1.0/bin/hbase shell查看已有表,创建新表,查看表结构listcreate 'student', 'info', 'scor...

EMR-flinksql运行失败问题

EMR-flinksql运行失败问题

运行flinksqlsql-client.sh报错:[root@emr1 bin]# ./sql-client.shSLF4J: Class path contains multiple SLF4J...

Ranger部署

安装前准备1.1. 创建用户和用户组groupadd rangeruseradd -g ranger ranger1.2. 数据库配置mysql -uroot -p -hxxx.xxx.xxx.13 ...

oracle PUS.SPU.CPU.BP.RU.RUR概念简介

PUS.SPU.CPU.BP.RU.RUR概念介绍PSU(Patch Set Updates):Oracle 选取在每个季度用户下载数量最多,并且得到验证具有较低风险的补丁放入到每个季度的PSU中,修...

发表评论    

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