如何最好地编写一个查询,从总共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;