1. 程式人生 > >MySQL實現隨機查詢

MySQL實現隨機查詢

方法一:
SELECT * FROM table ORDER BY RAND() LIMIT 1;
評價:不建議使用,效率非常低,官方文件中進行說明:Order By和RAND()連用,會多次掃描表,導致速度變慢。

方法二:
SELECT * FROM table
    WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM table)))
    ORDER BY id LIMIT 1;
思路:先查詢出table中的id的最大值,然後再獲取一個小於此值的隨機數,然後將滿足條件的行都選出來,取第一個;
評價:有問題。如果id不是從0開始的話,比如從10000開始自增,那麼SELECT floor (RAND() * (SELECT MAX(id) FROM table)) 將會很大概率得到小於10000的值,經過WHERE限定的查詢結果將會是所有的查詢結果的機率變大,最後LIMIT 1獲取的是第一行資料的機率變高。

方法三:
SELECT * FROM table
    WHERE id >= (SELECT floor (RAND() * ((SELECT MAX(id) FROM table) - (SELECT MIN(id) FROM table)) + (SELECT MIN(id) FROM table)))
    ORDER BY id LIMIT 1;
方法四:
SELECT *
FROM table AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM table) - (SELECT MIN(id) FROM table)) + (SELECT MIN(id) FROM table)) AS id ) AS t2
    WHERE t1.id >= t2.id
    ORDER BY t1.id LIMIT 1;
評價:解決了方法二中MAX(id)的問題,可以獲取MAX(id)和MIN(id)中的隨機數。