MySQL快速從60萬行中選擇10條隨機行

如何最好地編寫一個查詢,從總共60萬行中隨機選擇10行? mysql


#1樓

我使用了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


#2樓

SELECT column FROM table
ORDER BY RAND()
LIMIT 10

不是有效的解決方案,但有效 性能


#3樓

這是個人方法: 優化

select * 
from table_with_600k_rows
where rand() < 10/600000
limit 10

我喜歡它,由於它不須要其餘表,它編寫簡單,而且執行速度很是快。 spa


#4樓

我想這是最好的方法。 code

SELECT id, id * RAND( ) AS random_no, first_name, last_name
FROM user
ORDER BY random_no

#5樓

如何從表中選擇隨機行: 索引

從這裏開始: 在MySQL中選擇隨機行 get

對「表掃描」的快速改進是使用索引來拾取隨機ID。

SELECT *
FROM random, (
        SELECT id AS sid
        FROM random
        ORDER BY RAND( )
        LIMIT 10
    ) tmp
WHERE random.id = tmp.sid;
相關文章
相關標籤/搜索