首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mySQL子查询慢于两个单独的查询

mySQL子查询慢于两个单独的查询
EN

Stack Overflow用户
提问于 2014-12-23 13:23:25
回答 4查看 570关注 0票数 3

我正为一个简单的子查询而绞尽脑汁。下面是运行30+秒的查询女巫:

代码语言:javascript
复制
SELECT DISTINCT SUBSTRING( 6pp, 1, 4 ) AS postcode
FROM 6pp
WHERE gemeenteID
IN (
    SELECT gebiedID
    FROM tmp_orderimport
    WHERE typeGebied = 'Gemeente'
    AND idorder =1733
    AND STATUS = TRUE ); 

解释:

如果我在两个查询中中断查询,并首先运行in部分,则整个过程只需一秒钟。当然,我更喜欢使用一个查询。表格载于MYISAM。有什么建议吗?

更新:

以戈登·林诺夫为例。我将SQL更改为:

代码语言:javascript
复制
SELECT DISTINCT SUBSTRING( 6pp, 1, 4 ) AS postcode
FROM `6pp`
WHERE EXISTS (SELECT 1
          FROM tmp_orderimport oi
          WHERE oi.gebiedID = `6pp`.gemeenteID AND
                typeGebied = 'Gemeente' AND idorder = 1733 AND STATUS = TRUE
         ); 

并在tmp_orderimport上添加了一个索引(gebiedID、typeGebied、idorder、status)。现在,查询运行不到4秒。

新解释:

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-12-23 13:26:36

试着使用exists来代替:

代码语言:javascript
复制
SELECT DISTINCT SUBSTRING( 6pp, 1, 4 ) AS postcode
FROM `6pp`
WHERE EXISTS (SELECT 1
              FROM tmp_orderimport oi
              WHERE oi.gebiedID = `6pp`.gemeenteID AND
                    typeGebied = 'Gemeente' AND idorder = 1733 AND STATUS = TRUE
             ); 

您也可以通过在tmp_orderimport(gebiedID, typeGebied, idorder, status)上建立索引来加快速度。

当使用带有子查询的MySQL时,IN可能会效率低下(有时取决于版本)。EXISTS通常解决这个问题。具体的问题是每个比较都运行子查询。创建临时表时,可以避免这种情况。

票数 2
EN

Stack Overflow用户

发布于 2014-12-23 13:26:34

使用内连接代替运算符中的

试试这个:

代码语言:javascript
复制
SELECT DISTINCT SUBSTRING(a.6pp, 1, 4) AS postcode
FROM 6pp a
INNER JOIN tmp_orderimport b ON a.gemeenteID = b.gebiedID 
WHERE b.typeGebied = 'Gemeente' AND b.idorder =1733 AND b.STATUS = TRUE 
票数 1
EN

Stack Overflow用户

发布于 2014-12-23 13:30:09

可能MySQL正在对主查询的每个记录运行一次子查询。这最终导致了指数处理。

他的子查询独立于主查询,您可以先运行子查询并将值存储在内存中(可能是临时表),然后使用主查询。

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

https://stackoverflow.com/questions/27621289

复制
相关文章

相似问题

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