如何最好地編寫一個查詢,從總共60萬行中隨機選擇10行? mysql
我使用了Riedsio發佈的http://jan.kneschke.de/projects/mysql/order-by-rand/ (我使用的是存儲過程返回一個或多個隨機值的狀況): sql
DROP TEMPORARY TABLE IF EXISTS rands; CREATE TEMPORARY TABLE rands ( rand_id INT ); loop_me: LOOP IF cnt < 1 THEN LEAVE loop_me; END IF; INSERT INTO rands SELECT r1.id FROM random AS r1 JOIN (SELECT (RAND() * (SELECT MAX(id) FROM random)) AS id) AS r2 WHERE r1.id >= r2.id ORDER BY r1.id ASC LIMIT 1; SET cnt = cnt - 1; END LOOP loop_me;
在文章中,他經過維護一個表(使用觸發器等,請參見該文章)解決了id 差別致使的隨機性 問題 。 我正在經過向表中添加從1開始以連續數字填充的另外一列來解決該問題( 編輯:此列將添加到由子查詢在運行時建立的臨時表中,不會影響您的永久表): dom
DROP TEMPORARY TABLE IF EXISTS rands; CREATE TEMPORARY TABLE rands ( rand_id INT ); loop_me: LOOP IF cnt < 1 THEN LEAVE loop_me; END IF; SET @no_gaps_id := 0; INSERT INTO rands SELECT r1.id FROM (SELECT id, @no_gaps_id := @no_gaps_id + 1 AS no_gaps_id FROM random) AS r1 JOIN (SELECT (RAND() * (SELECT COUNT(*) FROM random)) AS id) AS r2 WHERE r1.no_gaps_id >= r2.id ORDER BY r1.no_gaps_id ASC LIMIT 1; SET cnt = cnt - 1; END LOOP loop_me;
在文章中,我看到他不遺餘力優化代碼。 我沒有想法是否/個人更改會影響性能多少,但對我來講效果很好。 oop
SELECT column FROM table ORDER BY RAND() LIMIT 10
不是有效的解決方案,但有效 性能
這是個人方法: 優化
select * from table_with_600k_rows where rand() < 10/600000 limit 10
我喜歡它,由於它不須要其餘表,它編寫簡單,而且執行速度很是快。 spa
我想這是最好的方法。 code
SELECT id, id * RAND( ) AS random_no, first_name, last_name FROM user ORDER BY random_no
如何從表中選擇隨機行: 索引
從這裏開始: 在MySQL中選擇隨機行 get
對「表掃描」的快速改進是使用索引來拾取隨機ID。
SELECT * FROM random, ( SELECT id AS sid FROM random ORDER BY RAND( ) LIMIT 10 ) tmp WHERE random.id = tmp.sid;