以下的文章主要介绍的是 MySQL http://database.51cto.com/art/200510/8400.htm 使用 rand 随机查询记录效率测试, 我们大家一直都以为 MySQL 数据库随机查询的几条数据, 就用以下的东东, 其实其实际效率是十分低的, 以下就是文章的主要内容.
SELECT * FROM `table` ORDER BY RAND() LIMIT 5
就可以了.
但是真正测试一下才发现这样效率非常低. 一个 15 万余条的库, 查询 5 条数据, 居然要 8 秒以上
查看官方手册, 也说 rand() 放在 ORDER BY 子句中会被执行多次, 自然效率及很低.
You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times.
搜索 Google, 网上基本上都是查询 max(id) * rand() 来随机获取数据.
- SELECT *
- FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2
- WHERE t1.id >= t2.id
- ORDER BY t1.id ASC LIMIT 5;
但是这样会产生连续的 5 条记录. 解决办法只能是每次查询一条, 查询 5 次. 即便如此也值得, 因为 15 万条的表, 查询只需要 0.01 秒不到.
上面的语句采用的是 JOIN,MySQL 的论坛上有人 MySQL 使用
- SELECT *
- FROM `table`
- WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` )
- ORDER BY id LIMIT 1;
我测试了一下, 需要 0.5 秒, 速度也不错, 但是跟上面的语句还是有很大差距. 总觉有什么地方不正常.
于是我把语句改写了一下.
- SELECT * FROM `table`
- WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))
- ORDER BY id LIMIT 1;
这下, 效率又提高了, 查询时间只有 0.01 秒
最后, 再把语句完善一下, 加上 MIN(id) 的判断. 我在最开始测试的时候, 就是因为没有加上 MIN(id) 的判断, 结果有一半的时间总是查询到表中的前面几行.
完整查询语句是:
- SELECT * FROM `table`
- WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECT MIN(id) FROM `table`)))
- ORDER BY id LIMIT 1;
- SELECT *
- FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`))+(SELECT MIN(id) FROM `table`)) AS id) AS t2
- WHERE t1.id >= t2.id
- ORDER BY t1.id LIMIT 1;
最后在 PHP 中对这两个语句进行分别查询 10 次,
前者花费时间 0.147433 秒
后者花费时间 0.015130 秒
看来采用 JOIN 的语法比直接在 WHERE 中使用函数效率还要高很多. 以上的相关内容就是对 MySQL 使用 rand 随机查询记录效率测试的介绍, 望你能有所收获.
来源: http://www.bubuko.com/infodetail-2902182.html