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;
相关文章
相关标签/搜索