2017-08-14 97 views
1

我有兩個查詢來計算相對較大的表中的行數。爲了允許按特定名稱進行過濾,我已經將一個較小的表格添加到了它。在幾乎相同的查詢中性能差異很大

我的第一次嘗試產生了查詢#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更好的解決方案?

編輯:

Explain Extended for query #1

Explain Extended for query #2

+3

第二個查詢是內部聯接 – Strawberry

+0

請爲這兩個查詢生成[執行計劃信息](https://dev.mysql.com/doc/refman/5.7/en/explain.html),並將它們附加到問題中(只需運行:'EXPLAIN EXTENDED your_query')。 – krokodilko

+0

我已經添加了執行計劃信息。 如果第二個是內連接,是否有可能實現左連接的效果而不會影響性能? –

回答

0

運行的每個查詢後,立即SHOW $警告將告訴您優化查詢執行順序。爲查詢#1和查詢#2發佈SHOW $ WARNINGS應該有助於我們理解爲什麼查詢#2更快。

+0

沒有'$'。只是'顯示警告;' –

相關問題