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