2010-11-07 141 views
0

我只是通過記錄緩慢查詢和EXPLAIN來優化查詢。我想的是...我不知道到底是什麼樣的東西,我應該尋找....我有查詢幫助優化簡單的MySQL查詢

SELECT DISTINCT 
     screenshot.id, 
     screenshot.view_count 
    FROM screenshot_udb_affect_assoc 
INNER JOIN screenshot ON id = screenshot_id 
    WHERE unit_id = 56 
    ORDER BY RAND() 
    LIMIT 0, 6; 

看着這兩個要素....我應該在那裏專注於優化?

id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE screenshot ALL PRIMARY NULL NULL NULL 504 Using temporary; Using filesort 
1 SIMPLE screenshot_udb_affect_assoc ref screenshot_id screenshot_id 8 source_core.screenshot.id,const 3 Using index; Distinct 
+0

哪些列來自查詢中的哪個表? – 2010-11-07 04:28:44

+0

他們來自'screenshot' – Webnet 2010-11-07 04:31:11

+1

'unit_id'呢? – 2010-11-07 04:34:41

回答

3

首先請不要使用ORDER BY RAND()。這在桌子尺寸較大時尤其會降低性能。 例如,即使使用limit 1,它也會生成與行數相等的隨機數,並選擇最小的一個。如果表大小很大或者會增長,這可能是低效的。關於此的詳細討論可以在以下網址找到:http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-table/

最後,還要確保您的join列已編入索引。

+0

我看到他的例子,它很出色,除了我必須確保行符合我的具體標準..... – Webnet 2010-11-07 04:38:40

+0

在100K記錄下,可以使用'ORDER BY RAND()'來處理這個問題,並且你希望開始尋找更好的選項。欲瞭解更多信息[見本文](http://www.dasprids.de/blog/2008/06/07/fetching-random-rows-of-mysql-efficiently) – 2010-11-07 04:39:45

1

嘗試:

SELECT s.id, 
     s.view_count 
    FROM SCREENSHOT s 
    WHERE EXISTS(SELECT NULL 
        FROM SCREENSHOT_UDB_AFFECT_ASSOC x 
       WHERE x.screenshot_id = s.id) 
ORDER BY RAND() 
    LIMIT 6 

在100K記錄,它的優良使用ORDER BY RAND() - over that, and you want to start looking at alternatives that scale better。欲瞭解更多信息,請致電see this article

+0

我這樣做,它會產生相同的結果,除了它還具有'使用where;'列出除了'Using temporary;使用filesort' – Webnet 2010-11-09 14:51:34

1

我kuriouscoder同意,使用ORDER BY RAND(),並避免採取確保每個以下字段都在一個單一的指標索引:

screenshot_udb_affect_assoc.id

screenshot.id

screenshot.unit_id

做到這一點使用如下代碼:

創建截圖(ID)指數指數1: