Heim > Datenbank > MySQL-Tutorial > mysql 随机查询数据_MySQL

mysql 随机查询数据_MySQL

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
Freigeben: 2016-06-01 13:35:31
Original
878 Leute haben es durchsucht

bitsCN.com

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

1 SELECT * FROM `table` ORDER BY RAND() LIMIT 5
Nach dem Login kopieren

 

就可以了。但是真正测试一下才发现这样效率非常低。一个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;
Nach dem Login kopieren

 

但是这样会产生连续的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;
Nach dem Login kopieren

 

 

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

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

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

 

这下,效率又提高了,查询时间只有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;
Nach dem Login kopieren

 

 

最后对这两个语句进行分别查询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;
Nach dem Login kopieren

 

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;
Nach dem Login kopieren

 

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

 

bitsCN.com
Verwandte Etiketten:
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage