2013-07-09 110 views
0

我有以下我想優化的簡單查詢:優化查詢,花費更多的時間來執行

SELECT a.id, a.name AS nam 
FROM ghost a 
WHERE a.name NOT 
IN (
SELECT ghost 
FROM users 
) 
ORDER BY RAND() 
LIMIT 1 

這個查詢現在正在5秒來執行,因爲鬼表有1200名的紀錄。如果有人優化了執行這個查詢的方法,因爲我想在ghost表中添加更多的名字,所以它會比現在大得多。但是,如果查詢花費太多的時間,現在那麼這將是地獄局面我,如果我增加更多的記錄...

下面是兩個表的結構: enter image description here enter image description here

+0

爲什麼隨機順序? –

+0

請添加表格結構。你有沒有定義任何索引? 1200條記錄就像數據庫一樣。 –

+0

因爲需要從表中隨機選擇名稱 – Aeykash

回答

0

可能嘗試重寫它作爲ORDER BY RAND()會損害性能更多

SELECT a.id, a.name AS nam 
FROM ghost a 
LEFT OUTER JOIN users b 
ON a.name = b.ghost 
WHERE b.ghost IS NULL 
ORDER BY RAND() 
LIMIT 1 

用戶表是否在ghost列上有索引?

爲了消除RAND你的順序可以嘗試這樣的事: -

SELECT a.id, a.name AS nam 
FROM ghost a 
INNER JOIN 
(
    SELECT RAND() * (MAX(z.id) - MIN(z.id)) + MIN(z.id) AS id 
    FROM ghost z 
    LEFT OUTER JOIN users y 
    ON z.name = b.ghost 
    WHERE y.ghost IS NULL 
) r2 
ON a.id >= r2.Id 
LEFT OUTER JOIN users b 
ON a.name = b.ghost 
WHERE b.ghost IS NULL 
ORDER BY a.id ASC 
LIMIT 1 
+0

是蘭德()函數花費很多時間...任何替代蘭特() – Aeykash

+0

幾乎相同的時間爲這兩個查詢... :( – Aeykash

+0

你可以發佈解釋? – Kickstart