我正在尋找一種從MySQL表中隨機選擇100行滿足特定條件的有效方法,這些行可能有數百萬行。如何從MySQL表中隨機選擇滿足特定條件的多行?
幾乎所有我發現的建議避免使用ORDER BY RAND(),因爲性能和可伸縮性較差。
但是,this article建議ORDER BY RAND()仍然可以用作獲取randow數據的「快捷方式」。
基於這篇文章,下面是一些示例代碼,顯示了我試圖完成的任務。我的問題是:
這是從一個表,可能有數百萬行隨機選擇100(或多達幾百個)行的有效途徑?
什麼時候成績會成爲問題?
SELECT user.* FROM ( SELECT id FROM user WHERE is_active = 1 AND deleted = 0 AND expiretime > '.time().' AND id NOT IN (10, 13, 15) AND id NOT IN (20, 30, 50) AND id NOT IN (103, 140, 250) ORDER BY RAND() LIMIT 100 ) AS random_users STRAIGHT JOIN user ON user.id = random_users.id
在索引字段上選擇隨機值是有意義的。 – Kayser 2012-03-28 16:52:34
@Kayser,我擔心我們仍然需要掃描WHERE條件的所有行。這是否會影響性能與巨大的表(可能數百萬行)? – user1298692 2012-03-28 17:05:04
使用pk-subselect的方法很可能只會稍微減少執行時間。這是因爲無論使用或不使用這種技術,都會爲所有匹配的行調用rand(),並且要排序的行數相同。假設「用戶」有很多列或者大的列,並且mysql在LIMIT發生後沒有足夠的智能來實現用戶*(這應該被測試),那麼這很有趣。 – 2012-03-28 19:49:33