几乎相同的查询中的巨大性能差异

时间:2017-08-14 21:37:51

标签: mysql performance phpmyadmin myisam

我有两个查询来计算一个相对较大的表中的行数。为了允许按特定名称进行过滤,我已经加入了一个较小的表格。

我的第一次尝试产生了查询#1(见下文),结果非常非常慢(6-7秒)。在讨论了一下这个问题之后,我开始查询#2(见下文),它似乎更快地做了同样的事情(<0.05秒)。

查询#1(&gt; 6秒):

SELECT COUNT(*)
FROM bigtable
LEFT JOIN (
    SELECT DISTINCT LocalKey, Name
    FROM smalltable
) AS smalltable ON bigtable.ForeignKey = smalltable.LocalKey;

查询#2(&lt; 0.05秒):

SELECT COUNT(*)
FROM bigtable
LEFT JOIN (
    SELECT DISTINCT LocalKey, Name
    FROM smalltable
) AS smalltable ON bigtable.ForeignKey = smalltable.LocalKey
WHERE smalltable.LocalKey LIKE "%";

两个查询都返回完全相同的数字(50300)。 bigtable有50300行,smalltable有680行。为了尽可能多地删除因素,我确保bigtable中的所有记录都在smalltable中具有(唯一的)匹配行。 smalltable.LocalKey已编入索引,以及bigtable的主键。两个表都已使用OPTIMIZE TABLE [table];进行了优化。 smalltable中的所有行都与smalltable.LocalKey LIKE "%"匹配。

我试图详尽地搜索这种现象,但是,我没有找到任何解释。有没有人解释为什么第一个查询要慢得多,如果可能的话,还有比查询#2更好的解决方案?

编辑:

Explain Extended for query #1

Explain Extended for query #2

1 个答案:

答案 0 :(得分:0)

运行每个查询后,SHOW $ WARNINGS将立即显示OPTIMIZED查询执行顺序。为查询#1和查询#2发布SHOW $ WARNINGS应该有助于我们理解为什么查询#2更快。