MySQL 慢 SELECT 查询

标签 mysql performance select indexing

我有一个查询,大致如下:

SELECT * FROM table1
WHERE confirmed = 0
AND resource = 123
AND id IN (
  SELECT id FROM table2 WHERE resource = 123
  AND added > 1440000000
)

运行需要将近 3 分钟,但我不知道为什么。这就是我感到困惑的原因......

SELECT id FROM table2 WHERE resource = 123
AND added > 1440000000

此子查询没有结果。一个都没有。所以,我想如果我这样做:

SELECT * FROM table1
WHERE confirmed = 0
AND resource = 123
AND id IN (
 0
)

它应该花费大约相同的时间来运行。除了它没有 - 它立即按预期返回 0 个结果。这是怎么回事?将空查询结果与 0 进行比较有什么不同?

行数也很低。我运行了一个解释,它使用表 1 的确认键和表 2 的主键。行数分别为 5500/20000。

如有任何想法,我们将不胜感激!谢谢!

最佳答案

使用显式join,您的查询会运行得更快。如果子查询不返回重复值:

SELECT t1.*
FROM table1 t1 JOIN
     (SELECT id FROM table2 WHERE resource = 123 AND added > 1440000000
     ) t2
     ON t1.id = t2.id
WHERE confirmed = 0 AND resource = 123;

此外,MySQL 通常可以更好地优化 NOT EXISTS:

SELECT t1.*
FROM table1 t1
WHERE confirmed = 0 AND resource = 123 AND
      NOT EXISTS (SELECT 1
                  FROM table2 t2
                  WHERE t2.id = t1.id AND t2.resource = 123 AND t2.added > 1440000000
                 );

使用 table2(id, resource, added) 上的索引,此查询将运行得更快。

关于MySQL 慢 SELECT 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33083082/

相关文章:

c# - 为什么 C++ fseek/fread 的性能是 C# FileStream 的 Seek/Read 的数倍

python - (flask) python mysql - 如何通过 for 循环传递选定的数据并返回它?

mysql - 如何删除mysql中四个表的记录?

javascript - Gulp sass (libsass) 使用 return 时速度极慢

ruby - 是 &method( :method_name) idiom bad for performance in Ruby?

php - 从不存在值的表中选择

mysql - 在 MySQL 中选择不为空的 DISTINCT

使用 IP 作为主机时,PHP 无法连接到 MySQL Workbench,但使用 localhost 时工作正常

php - 从MySQL中选择数据进行多折线图

MySQL:最好有两个表或两列