mySQL 子查询比 2 个单独的查询慢

标签 mysql sql select subquery query-optimization

我正在为一个简单的子查询而烦恼。我有以下查询女巫运行了 30 多秒:

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 ); 

解释: Explain

如果我将查询分成 2 个查询并首先运行 IN 部分,整个过程不会超过一秒钟。但我当然更喜欢使用一个查询。这些表在 MYISAM 中。有什么建议吗?

更新:

以 Gordon Linoff 为榜样。我将 SQL 更改为:

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 秒。

新解释: New SQL explain

最佳答案

尝试使用 exists 代替:

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) 上的索引来加快速度。

IN 与子查询一起使用时,MySQL 可能效率低下(有时并且取决于版本)。 EXISTS 通常可以解决问题。具体问题是每次比较都要运行子查询。当您创建一个临时表时,您可以规避它。

关于mySQL 子查询比 2 个单独的查询慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27621289/

相关文章:

php - 在php中匹配并访问带有数据库列的字符串

mysql - Rails 迁移以将主键添加到现有表

mysql - MySQL 中的自然连接与匹配列

mysql - 统计数据库中当前数据为最大日期的数据

wpf - 如何通过在WPF组合框中键入键盘字母键来选择项目?

mysql - 环回过滤器不在日期之间

php - 从 ID 不在另一个查询中的房间中选择 ID +(日期比较)

mysql - 如何解决sql中的重复值

java - 关于数据库查询的简单问题

asp.net - 如何在 EntityDataSource 中使用 CASE 语句进行排序?