mysql怎样优化count(*) from 表名 where …… or ……这种慢sql

一 问题描述

线上发现一条类似这样的慢sql(查询时长8s):

select id,name,(select count(*) from t14 where t14.id=t15.id or t14.id2=t15.id) as cnt

from t15 ;

t14的id和id2字段上都有索引,但是因为条件里有or,导致走的是全表扫描:

如果没用count(*),而是select 字段这种方式,那可以用union这种方式替代or,但这里是count(),则有些不同。

二 优化逻辑

将select count(*) from t14 where t14.id=t15.id or t14.id2=t15.id改为以下三种情况:

1、 t14.id=t14.id2,此时t14.id = t15.id与t14.id2=t15.id是等价的,写哪个都可以

2、 t14.id!=t14.id2时,分成两种情况:

t14.id = t15.id

② t14.id2 = t15.id

三 改写后的sql

select id,name,

(select count(*) from t14 where t14.id=t15.id and t14.id=t14.id2)

(select count(*) from t14 where t14.id=t15.id and ifnull(t14.id,'isnull')!=ifnull(t14.id2,'isnull')

)

(select count(*) from t14 where t14.id2=t15.id and t14.id!=t14.id2)

as cnt

from t15

加ifnull(字段,'isnull')函数是因为发现关联字段是null时,关联不上,所以这里将这些空值转换为了isnull这个字符串。

执行计划走了索引:

逻辑看起来比之前复杂了,但是查询时长由8秒降到了1.2秒

相关推荐
SuperSpinach1 小时前
mysql 报错Authentication method ‘caching_sha2_password‘ is not supported.
数据库·mysql
R.lin1 小时前
MySQL 性能优化最佳实践
数据库·mysql·性能优化
失散134 小时前
分布式专题——57 如何保证MySQL数据库到ES的数据一致性
java·数据库·分布式·mysql·elasticsearch·架构
kka杰6 小时前
MYSQL结构操作DDL指令1.数据库操作
数据库·mysql
Arva .6 小时前
MySQL 中的 MVCC
数据库·mysql
Boilermaker19927 小时前
【MySQL】数据目录与日志开篇
数据库·mysql
小满、9 小时前
MySQL :实用函数、约束、多表查询与事务隔离
数据库·mysql·事务·数据库函数·多表查询
weixin_5377658015 小时前
【数据库管理】MySQL主从复制详解
数据库·mysql
倚肆16 小时前
MySQL 配置文件属性详解
数据库·mysql
百***221218 小时前
mysql的分区表
数据库·mysql