查询数据mysql 随机查询数据

废话就不多说了,开始。。。

    在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 DISTINCT
2     c.id, c.`name`, c.age, c.address
3 FROM
4     contact as c
5 WHERE
6   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 DISTINCT
2     c.id, c.`name`, c.age, c.address
3 FROM
4     contact as c
5     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.id
8 LIMIT 4;
 

    

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

 

文章结束给大家分享下程序员的一些笑话语录: 程序语言综述
CLIPPER 程序员不去真的猎捕大象,他们只是购买大象部分的库然后花几年的时间试图综合它们。
DBASE 程序员只在夜间猎捕大象,因为那时没人会注意到他们还在使用石弓。
FOXPRO 程序员开始使用更新更好的步枪,这使他们花掉比实际狩猎更多的时间学习新的射击技术。
C 程序员拒绝直接购买步枪,宁可带着钢管和一个移动式机器车间到非洲,意欲从零开始造一枝完美的步枪。
PARADOX 程序员去非洲时带着好莱坞关于猎捕大象的电影剧本,他们认为照剧本行事就会逮到一头大象。
ACCESS 程序员在没有任何猎象经验的经验下就出发了,他们穿着华丽的猎装、带着全部装备,用漂亮的望远镜找到了大象,然后发觉忘了带扳机。
RBASE 程序员比大象还要稀少,事实上,如果一头大象看到了一个RBASE程序员,对他是个幸运日。
VISUAL ACCESS 程序员装上子弹、举起步枪、瞄准大象,这使大象感到可笑,究竟谁逃跑。他们无法抓住大象,因为由于他们对多重控制的偏爱,他们的吉普车有太多的方向盘因而无法驾驶。
ADA、APL和FORTRAN 程序员与圣诞老人和仙女一样是虚构的。
COBOL 程序员对和自己一样濒临灭绝的大象寄予了深切的同情。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值