MySQL 巧写sql提高rand随机查询速度

[database] MySQL巧写sql提高rand随机査询速度2009 年 01 月 23 日 11:15测试数据:表名:by_blogreply2记录:7389147条说明:其他测试条件以及MySQL优化配置未计算在内,采取默认配置测试1:select * from by_blogreply2 order by rand() limit 1;结果 1: 1 min 26.08 sec测试 2: # max() * rand()select * from by_blogreply2 where replyid >= (select floor(rand() * ((select max(replyid) from by_blogreply2) - (select min(replyid) from by_blogreply2)) + (select min(replyid) from by_blogreply2))) order by replyid limit 1;结果 2: 0.01 sec测试 3: # joinselec t * from by_blogreply2 ast1 join(selec t round(rand() * ((selec t max(replyid) from by_blogreply2) - (select min(replyid) from by_blogreply2)) + (select min(replyid) from by_blogreply2)) as replyid) as t2 where t1 .replyid >= 12.replyid order by t1.replyid limit 1;结果 3: 0.03 sec总结:一般来说都喜欢用第一条sql语句,可以看出大数据量时候速度是爆慢无比,不过也没谁 喜欢在几百万数据里随机一个出来把。
第二和第三条语句看似很复杂,不过效率确实提升了不止 一个档次可言第二条是用floor下rand *最大ID -最小ID再加上最小ID,实际是取一个 ID的随机数出来第三条是了 join原文参见 htt p:// tmlmysql获取随机数rand()函数优化添加评论 2011年8 月 21日 枫子从数据表随机获取 N 条数据记录的方法有很多,其中最简单的莫过于 SELECT * FROM 'table' WHERE 1 ORDER BYrand() LIMIT N 这个语句得好处在于简单,但前提条件是查询 的结果集必须小于5W记录集的情况下方可使用,若数据结果集超过了 5W,其查询出来的 速度将非常的耗资源下面语句枫子是在数据库记录数16,246,264(1600W)条下进行测试的查看源代码打印帮助SELECT * FROM 'baidu' AS k1 JOIN (SELECT ROUND( RAND( ) * ((SELECT MAX( id ) FROM 'baidu' ) - (SELECT MIN( id ) FROM 'baidu' ) ) +(SELECT MIN( id ) FROM 'baidu' )) AS id) AS k2WHERE k1.id >= k2.id LIMIT 100.0445 秒 连续记录SELECT * FROM 'baidu'WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM 'baidu')))ORDER BYid LIMIT 10;0.0710 不连续SELECT *FROM 'baidu' AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM 'baidu')-(SELECT MIN(id) FROM 'baidu'))+(SELECT MIN(id) FROM 'baidu')) AS id) AS t2WHERE t1.id >= t2.idORDER BYt1.id LIMIT 10;0.0203 连续的SELECT * FROM 'baidu'WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM 'baidu')-(SELECT MIN(id) FROM 'baidu')) + (SELECT MIN(id) FROM 'baidu')))ORDER BYid LIMIT 10;0.0668 不连续。