mysql 隨機查詢 記錄集
阿新 • • 發佈:2018-11-07
本質都是利用mysql 的rand() 第一種方法: SELECT * FROM reportcard_patient_temp ORDER BY RAND() LIMIT 10 利用mysql的隨機函式order by,這是最容易想到的,筆者在mysql 5.6.27上面explain查看了執行計劃 : +----+-------------+-------------------------+------+---------------+------+---------+------+------+---------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------------------------+------+---------------+------+---------+------+------+---------------------------------+ | 1 | SIMPLE | reportcard_patient_temp | ALL | NULL | NULL | NULL | NULL | 2479 | Using temporary; Using filesort | +----+-------------+-------------------------+------+---------------+------+---------+------+------+---------------------------------+ 1 row in set 可以看出select type 是simple(這裡是單表),在近40萬的資料隨機取了10條時間也只有1.2秒~2秒左右,還是可以接受的,並沒有像網上說的哪有要重複查詢多次。 第二種 SELECT * FROM `table` WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) ORDER BY id LIMIT 10; 這種方法最大的弊端在於如果主鍵不是自增的該如何?當然在主鍵自增的時候還是可以使用的 第三種,這是筆者自己想出的方法,既然要利用mysql自帶的隨機函式,那麼對於不是自增的主鍵,如何把轉化rand()就成了問題的關鍵,利用count(*)這個整數集 SELECT * FROM ( SELECT zyid ,ROUND(RAND()) AS newno FROM yw_syjgb GROUP BY zyid )AS t ORDER BY t.newno asc LIMIT 10 同樣的40萬的記錄集,隨機取10條記錄,時間只需要0.1秒左右,可以說比order by rand()提升還是蠻大的,當然也是可以 把 ROUND(COUNT(*)*RAND()*100) AS newno 作為limit後面的值隨機定位記錄集,需要注意的是要控制其為整數。 基於資料庫層隨機查詢的還有些很多零碎的方法,這裡筆者覺得符合自身業務復的方法其實還很多,比如你可以在程式裡做隨機挑選演算法,或者自己實現一個rand()函式。
轉自https://www.cnblogs.com/drcoding/p/5329294.html