2014-01-11 22 views
1

我創建了一個包含100k行的測試表。此查詢的執行時間:如何阻止LIMIT放慢查詢速度?

SELECT id FROM table 

0.032s。如果我添加一個GROUP BY語句被索引爲Normal,BTREE,執行時間用於查詢的整數列:

SELECT id FROM table GROUP BY indexedColumn 

EXPLAIN輸出:

id | select_type | table | type | possible keys | key | key_len | ref | rows | Extra 
1  SIMPLE [table] All [indexedColumnKey] null null null 105416 Using temporary; Using filesort 

0.073s。由於GROUP BY,執行時間增加了一倍,但我認爲這是正常的?這個問題我有,是爲什麼添加LIMIT到查詢,像這樣:

SELECT id FROM table GROUP BY indexedColumn LIMIT 500 

EXPLAIN輸出:

id | select_type | table | type |  possible keys |  key  | key_len | ref | rows | Extra 
1  SIMPLE [table] index [indexedColumnKey] [indexedColumnKey]  5  null 500  null 

增加了執行時間0.301s?這是一個超過4倍的放緩。

我對SQL非常不熟悉,所以也許這是完全正常的,但對於我來說,限制返回的行數會減慢查詢的速度,這似乎與此相反。

問題:

  1. 這是正常的嗎?
  2. 有沒有辦法阻止LIMIT放慢查詢速度?
+0

您是如何評估這個的? – Nanne

+1

如果你在查詢前添加Explain,你會得到這個計劃,懷疑它是在進行第二次排序來發現「第一個」500. –

+0

@Nanne你的意思是執行時間?執行查詢後,我將它們從Navicat中取出。 – Nate

回答

0

查詢SELECT id FROM table GROUP BY indexedColumn不使用索引。它在你的解釋中顯示。但是當你使用限制時,索引被使用。 此外,對於實驗,您可以使用SQL_NO_CACHE禁用緩存SELECT SQL_NO_CACHE ....

+0

索引不應該更快,而不是更慢? – Nate

+0

@Nate,索引應該會更快。您可以請'設置profiling = 1;'用SQL_NO_CACHE運行第一個查詢,然後在'show profiles;'之後運行第二個查詢併發布結果; – Anton