关于使用太多or条件的SQL优化

【TiDB 使用环境】生产环境 /测试/ Poc
【TiDB 版本】

 /* dynamic native SQL query */
SELECT
  COUNT(1)
FROM
  Inv_A
where 
1=1
  AND Inv_A.chargeType = '1'
  AND 
   (
   comXXX IN (
          SELECT
            comXXX
          FROM
            pingcap
          WHERE
            Path LIKE (
              SELECT
                concat(Path, '%')
              FROM
                pingcap
              WHERE
                comXXX = '3401810429'
            )
            AND validStatus = '1'
        )
        OR comXXX IN (
          SELECT
            comXXX
          FROM
            pingcap
          WHERE
            Path LIKE (
              SELECT
                concat(Path, '%')
              FROM
                pingcap
              WHERE
                comXXX = '3401810430'
            )
            AND validStatus = '1'
        )
        OR comXXX IN (
          SELECT
            comXXX
          FROM
            pingcap
          WHERE
            Path LIKE (
              SELECT
                concat(Path, '%')
              FROM
                pingcap
              WHERE
                comXXX = '3401810431'
            )
            AND validStatus = '1'
		)
	)

生产环境有类似的SQL, 使用or条件多达8-10个的情况 ,大家解决这类SQL最好的方式是那种,是改写成select distinct comXXX去重,后面的 comXXX = 改成in 嘛,还是有关于这类SQL的hint 不用改写就可以解决

1 个赞

我们一般是改写成in,不能改写成in的,就插到临时表 或者 改成union all

3 个赞

union 拆成多个语句

SQL复杂了 解析执行计划会有问题,拆分多个

1 个赞

支持union all

先改写 SQL 结构,再结合 Hint 优化

or岂不是用不上索引了

嗯,这个是可行的

union

先是可通过 “将多个 comXXX 条件合并为 IN 列表,统一执行一次子查询” 减少扫描次数,同时用 DISTINCT 确保去重

统计时如果业务允许禁用多列统计,减少内存消耗

pingcap 表建联合索引,提供查询速度

我的天啊,这是多少前台,看看最好分拆一下逻辑进行查询吧