mysql查询优化-加速|索引使用

sgtfey8w  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(324)

我有以下mysql查询,需要一天以上的时间才能执行:

SELECT SN,NUMBER FROM a

WHERE SN IN 
    (SELECT LOWER_SN FROM b
    WHERE HIGHER_ED  LIKE "%c1" AND LOWER_ED LIKE "%16")
AND ED LIKE "%16"

子查询运行需要21秒,返回11035行。我在a上有索引:

SHOW INDEX FROM a

表非唯一键名称seq in索引列名称排序规则基数子部分压缩空索引类型注解索引注解
0 a 1摆动1 1 756095无B树
1 a 1 wob2 1 sn a 2268287无btree
钻压756095无钻杆
3 a 1 wob3 2 sn a 9073150无btree
4 a 1 wob4 1编号a 18146301无是B树
5 a 1 wob5 1 sn a 2268287无btree
6 a 1 wob5 2编号a 18146301无是B树 EXPLAIN 给予:

id,选择类型,表,类型,可能的键,键,键长度,参考,行,额外

'1','primary','a','all',null,null,null,null,'18146301','using where'
'2','dependent subquery','b','index\u subquery','cfg2','cfg2','47','func','6','using where'
为什么不使用索引?如何加快查询速度?

xzabzqsa

xzabzqsa1#

SELECT a.SN, a.NUMBER 
FROM a
WHERE EXISTS (
   SELECT * 
   FROM b
   WHERE b.LOWER_SN = a.SN
      AND b.HIGHER_ED  LIKE "%c1" 
      AND b.LOWER_ED LIKE "%16"
)
AND a.ED LIKE "%16"

我通常不是相关子查询的支持者,原因有很多;但由于您不能从索引中获益,所以这可能是可行的。
它将有效地在后台为每个 a 记录(或者如果查询优化器有帮助,可能只有 a 符合 a.ED LIKE 条件)。通常情况下,这将更昂贵;但是 EXISTS 子查询的运行速度比上一个子查询快得多,因为它只需要计算 b 记录具有特定的较低的\u sn值,并且当查找单个匹配项而不是查找每个匹配项时,exists会给它一个“提前退出”选项。你应该索引 b.LOWER_SN 以确保 b 每个的记录 a 尽快识别记录。
如果上面的版本仍然很慢,那么不妨尝试一下:

SELECT a2.SN, a2.NUMBER 
FROM (SELECT a.SN, a.NUMBER FROM a WHERE AND a.ED LIKE "%16") AS a2
WHERE EXISTS (
   SELECT * 
   FROM b
   WHERE b.LOWER_SN = a2.SN
      AND b.HIGHER_ED  LIKE "%c1" 
      AND b.LOWER_ED LIKE "%16"
)

它基本上只是强制a表在 a.ED LIKE 如果优化器不这样做,则先设置条件。

相关问题