Home >Database >Mysql Tutorial >mysql 随机查询数据_MySQL

mysql 随机查询数据_MySQL

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOriginal
2016-06-01 13:35:31882browse

bitsCN.com

在mysql中查询5条不重复的数据,使用以下:

1 SELECT * FROM `table` ORDER BY RAND() LIMIT 5

 

就可以了。但是真正测试一下才发现这样效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上

搜索Google,网上基本上都是查询max(id) * rand()来随机获取数据。

1 SELECT * 2 FROM `table` AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM `table`)) AS id) AS t2 3 WHERE t1.id >= t2.id 4 ORDER BY t1.id ASC LIMIT 5;

 

但是这样会产生连续的5条记录。解决办法只能是每次查询一条,查询5次。即便如此也值得,因为15万条的表,查询只需要0.01秒不到。

上面的语句采用的是JOIN,mysql的论坛上有人使用

1 SELECT * 2 FROM `table` 3 WHERE id >= (SELECT FLOOR( MAX(id) * RAND()) FROM `table` ) 4 ORDER BY id LIMIT 1;

 

 

我测试了一下,需要0.5秒,速度也不错,但是跟上面的语句还是有很大差距。总觉有什么地方不正常。

于是我把语句改写了一下。

1 SELECT * FROM `table` 2 WHERE id >= (SELECT floor(RAND() * (SELECT MAX(id) FROM `table`)))  3 ORDER BY id LIMIT 1;

 

这下,效率又提高了,查询时间只有0.01秒

最后,再把语句完善一下,加上MIN(id)的判断。我在最开始测试的时候,就是因为没有加上MIN(id)的判断,结果有一半的时间总是查询到表中的前面几行。
完整查询语句是:

1 SELECT * FROM `table` 2 WHERE id >= (SELECT floor( RAND() * ((SELECT MAX(id) FROM `table`)-(SELECT MIN(id) FROM `table`)) + (SELECTMIN(id) FROM `table`)))  3 ORDER BY id LIMIT 1;4 5 SELECT * 6 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 7 WHERE t1.id >= t2.id 8 ORDER BY t1.id LIMIT 1;

 

 

最后对这两个语句进行分别查询10次,
前者花费时间 0.147433 秒
后者花费时间 0.015130 秒
看来采用JOIN的语法比直接在WHERE中使用函数效率还要高很多。

-------------------------------------------------

以上来自:http://blog.csdn.net/zxl315/article/details/2435368

ps:上面的查出来的数据是连续的,如果想要得到非连续数据则可以用如下方法:

1. 能过EXISTS子查询得到几个随机数,再从中取得数据(不推荐,50W条数据耗时1秒多,只能说这是一种方法来参考)

1 SELECT DISTINCT2     c.id, c.`name`, c.age, c.address3 FROM4     contact as c5 WHERE6   EXISTS (SELECT 1 FROM (SELECT 7                     ROUND(RAND() * (SELECT MAX(id) - MIN(id) FROM contact) + (SELECT MIN(id) FROM contact)) AS id 8                 from contact LIMIT 40) AS t1 WHERE t1.id = c.id)9 LIMIT 4;

 

2. 通过JOIN来得到随机数据,50W条数据耗时0.001秒

1 SELECT DISTINCT2     c.id, c.`name`, c.age, c.address3 FROM4     contact as c5     JOIN (SELECT 6               ROUND(RAND() * (SELECT MAX(id) - MIN(id) FROM contact) + (SELECT MIN(id) FROM contact)) AS id 7           FROM contact LIMIT 40) AS t2 ON c.id = t2.id8 LIMIT 4;

 

上面数据为本地测试,mysql版本为5.5.27

 

bitsCN.com
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn