我有两个查询来计算一个相对较大的表中的行数。为了允许按特定名称进行过滤,我已经加入了一个较小的表格。
我的第一次尝试产生了查询#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更好的解决方案?
编辑:
答案 0 :(得分:0)
运行每个查询后,SHOW $ WARNINGS将立即显示OPTIMIZED查询执行顺序。为查询#1和查询#2发布SHOW $ WARNINGS应该有助于我们理解为什么查询#2更快。