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

俊达2周前技术文章17

优化器是数据库中非常核心,又非常复杂的一个组件。有的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能帮助优化器更好地优化查询语句。也能让执行计划更稳定。



相关文章

云原生之网络篇

云原生之网络篇

前言:在云原生如火如荼的今天,作为云原生的基石:kubernetes(简称k8s)是不得不掌握的技术。而k8s的网络插件是大家绕不开的技术,但是由于k8s的开源包容性,以及网络的复杂性,导致网络插件出...

ES运维(三)架构与规划(阿里云)

ES运维(三)架构与规划(阿里云)

1、 阿里云Elasticsearch架构图阿⾥云Elasticsearch和Kibana容器化运⾏在ECS中,监控agent(独⽴进程)负责收集监控指标,通过SLS发送给云监控完成监控报警。实例之间...

使用clickhouse-copier迁移数据

说明clickhouse-copier是clickhouse官方提供的一个数据迁移工具。支持将clickhouse表从一个集群迁移到另外一个集群。使用clickhouse-copier有一些限制条件:...

CDH配置impala自动同步HMS元数据

CDH配置impala自动同步HMS元数据

1、进入CM界面 > Hive > 配置 > 搜索 启用数据库中的存储通知(英文界面搜索:Enable Stored Notifications in Database),并且勾选,...

Linux操作系统启动流程

Linux操作系统启动流程

无论Windows还是Linux操作系统,启动之前都会对硬件进行检测,之后硬盘引导启动操作系统,下面是与启动系统相关的几个概念。BIOS基本输入输出系统 是一组固化到计算机主板上的只读内存镜...

Clickhouse MergeTree 原理(一)

Clickhouse MergeTree 原理(一)

MergeTree是Clickhouse里最核心的存储引擎。Clickhouse里有一系列以MergeTree为基础的引擎(见下图),理解了基础MergeTree,就能理解整个系列的MergeTree...

发表评论    

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