我执行以下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行。我有一个索引:
SHOW INDEX FROM a
排序表Non_unique Key_name Seq_in_index Column_name排序基数Sub_part压缩空Index_type注释Index_comment
0 a 1 wob1 1 ED A 756095无故障树
1个1 wob2 1 SN A 2268287无故障树
2个1 wob3 1 ED A 756095无故障树
3个1 wob3 2 SN A 9073150无故障树
4 1 wob4 1数字A 18146301无无是BTREE
5个1 wob5 1 SN A 2268287无故障树
6 a 1 wob5 2数字A 18146301无是BTREE
EXPLAIN
提供了:
id,主键,表,类型,键,键,引用,行,额外的'1',‘select_type’,'a','ALL',NULL,'18146301','Using where‘
'2','DEPENDENT SUBQUERY','b','index_subquery','cfg2','cfg2','47','func','6','Using where‘
为什么不使用索引呢?如何加快查询速度?
发布于 2018-06-21 06:08:08
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.ED LIKE
条件匹配的a
记录)。通常,这样做的成本会更高;但是,EXISTS
子查询的运行速度可以比以前的子查询快得多,因为它只需要计算具有特定LOWER_SN值的b
记录,而且EXISTS在找到单个匹配项时为它提供了“提早”,而不是找到每个匹配项。您应该为b.LOWER_SN
建立索引,以确保尽快识别每个a
记录的b
记录。
如果上面的版本仍然很慢,可能值得尝试一下:
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
条件进行过滤。
https://stackoverflow.com/questions/50957676
复制相似问题