我有一個表foo
與(其他20個)列bar
,baz
和quux
與索引baz
和quux
。該表有500k行。爲什麼MAX()比ORDER BY ... LIMIT 1慢100倍?
爲什麼以下查詢在速度上差異如此之大?查詢A需要0.3s,而查詢B需要28s。
查詢
select baz from foo
where bar = :bar
and quux = (select quux from foo where bar = :bar order by quux desc limit 1)
解釋
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY foo ref quuxIdx quuxIdx 9 const 2 "Using where"
2 SUBQUERY foo index NULL quuxIdx 9 NULL 1 "Using where"
查詢乙
select baz from foo
where bar = :bar
and quux = (select MAX(quux) from foo where bar = :bar)
說明
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY foo ref quuxIdx quuxIdx 9 const 2 "Using where"
2 SUBQUERY foo ALL NULL NULL NULL NULL 448060 "Using where"
我使用MySQL 5.1.34。
'LiMIT 1'意味着採取1行並停止,不是嗎?查詢B是O(n * m) – jondinham
@PaulDinh似乎兩個查詢的結果都是相同的,最有可能與操作順序有關,第一種情況下它通過quux和搜索欄從結果中快速排序(快速)搜索欄(需要檢查整個表)從未分類,然後排序,以找到最大 –
@Viktor,你可以請顯示 '解釋選擇baz從foo 其中bar =:bar 和quux =(選擇quux從foo其中quux = MAX(quux)and bar =:bar)' '說明從foo中選擇baz 其中bar =:bar 和quux =(從foo選擇quux,其中quux = MAX(quux)和bar =:bar limit 1)' –