我有兩個查詢來計算相對較大的表中的行數。爲了允許按特定名稱進行過濾,我已經將一個較小的表格添加到了它。在幾乎相同的查詢中性能差異很大
我的第一次嘗試產生了查詢#1(見下文),結果非常非常慢(6-7秒)。在查詢了一下之後,我開始查詢#2(見下文),這似乎更快地完成了同樣的事情(< 0.05秒)。
查詢#1(> 6秒):
SELECT COUNT(*)
FROM bigtable
LEFT JOIN (
SELECT DISTINCT LocalKey, Name
FROM smalltable
) AS smalltable ON bigtable.ForeignKey = smalltable.LocalKey;
查詢#2(<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更好的解決方案?
編輯:
第二個查詢是內部聯接 – Strawberry
請爲這兩個查詢生成[執行計劃信息](https://dev.mysql.com/doc/refman/5.7/en/explain.html),並將它們附加到問題中(只需運行:'EXPLAIN EXTENDED your_query')。 – krokodilko
我已經添加了執行計劃信息。 如果第二個是內連接,是否有可能實現左連接的效果而不會影響性能? –