我有兩個表:上優化MySQL隨機查詢
Table GAME: id(int), added_at(bigint)
Table META: id_game(int), meta(VARCHAR(64))
現在,每場比賽可以有0個或更多元與之相關的標籤。我試圖找回9場比賽:
- 1隨機遊戲 「精選」 META
- 1隨機遊戲 「溢價」 META
- 1隨機遊戲 「doublepoints」 META
- 3個最新遊戲(ORDER BY added_at DESC)
- 3個隨機的遊戲不屬於任何的6場以上
截至目前我已經做的相當胡思亂想系統,它看起來更Ø [R少這樣的:
$feat = getGameMetaRandom(1, 'featured');
$prem = getGameMetaRandom(1, 'premium');
$dubl = getGameMetaRandom(1, 'doublepoints');
$last = getGameLatest(3);
$rand = getGameRandom(3);
目前各隨機函數有兩個查詢(從getGameMetaRandom($count, $meta);
):
SELECT FLOOR(RAND() * (COUNT(*) - " . ($count - 1) .")) AS `offset`
FROM table_meta WHERE meta = '{$meta}'
SELECT t1.* FROM table_meta t2
LEFT JOIN table_game t1 ON t1.id = t2.id_game
WHERE t2.meta = '{$meta}' LIMIT {$offset}, {$count}
(gameRandom很相似),正如你可以看到這忽略了我的限制這些不是以上的6個遊戲中的任何一個,再加上所有這些都需要9個查詢,並且隨機化並不是真正的隨機性。
所以我的三個目標,我的可能的解決方案是:
- 如何讓3級隨機的遊戲沒有任何重複的aforeselected遊戲。在選擇前六場比賽之後,我可能會列出他們的ID,並在NOT IN()的最後一個查詢中使用它們,但不會過度優化。
- 如何隨機隨機抽取遊戲,而不是選擇隨機選擇並採取n來自它的遊戲?顯然使用ORDER BY RAND(),但是我聽說關於它的速度有多慢真的很糟糕,儘管我猜想除非我的表有數百行,它並沒有什麼區別?
- 如何減少查詢次數?集團前三查詢爲一體,我留下了5個查詢,或通過使用ORDER BY RAND()我可以忽略第一個「偏移檢索」查詢與和東西去像
SELECT t1.* FROM table_meta t2 LEFT JOIN table_game t1 ON t1.id = t2.id_game WHERE t2.meta = '{$meta}' ORDER BY RAND() LIMIT {$count}
但儘管如此,thiese通常需要使用ORDER BY RAND(),並且我看到一些測試使它看起來非常慢。任何提示,以改善它甚至更多?
有三個問題,沒有一個是直接或微不足道的...... – RichardTheKiwi 2011-03-18 11:21:14
@Richard又名cyberkiwi:我..猜。我已經添加了一些可能的解決方案和我對它們的關注,如果這樣可以更容易考慮。我是MySQL的新手,我幾乎不知道任何事情。 – Maurycy 2011-03-18 11:34:27