首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MySQL查询优化-加速|索引使用

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

Stack Overflow用户
提问于 2018-06-21 06:01:03
回答 1查看 53关注 0票数 0

我执行以下MySQL查询需要一天以上的时间:

代码语言:javascript
复制
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行。我有一个索引:

代码语言:javascript
复制
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‘

为什么不使用索引呢?如何加快查询速度?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-21 06:08:08

代码语言:javascript
复制
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记录。

如果上面的版本仍然很慢,可能值得尝试一下:

代码语言:javascript
复制
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条件进行过滤。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50957676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档