几种高效率高性能mysqll随机取数据方法

正文 分享:mysql随机查询若干条数据的方法
分享:mysql随机查询若干条数据的方法
发布时间: & 编辑:www.jquerycn.cn
本文介绍下,mysql数据库中获取随机内容的方法,学习下mysql中rand()函数的用法,有兴趣的朋友可以参考学习下。
SELECT * FROM `table` ORDER BY RAND() LIMIT 5
不过这样的效率非常低。一个15万余条的库,查询5条数据,居然要8秒以上
网上基本上都是查询max(id) * rand()来随机获取数据。
复制代码 代码示例:
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的论坛上有人使用:
复制代码 代码示例:
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;
--www.jbxue.com
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;
最后,对这两个语句进行分别查询10次,
前者花费时间 0.147433 秒
后者花费时间 0.015130 秒
小结:采用JOIN的语法比直接在WHERE中使用函数效率还要高很多。
您可能感兴趣的文章:
mysql随机查询的经验分享
解析mysql实现随机查询的几种方法
mysql随机查询大量数据的sql语句性能分析
mysql 随机生成某个范围内的整数
mysql取随机数据的方法
mysql全文查询与随机查询的例子
mysql随机取数据的几种方法
mysql随机查询记录的效率测试笔记您可能感兴趣的文章:mysql 多人同时从表phones中随机取一条数据,如何避免取到同一条? - ITeye问答
数据库是mysql
表phones,有一个字段status,默认值为0,如果被取,则值改为1
现在有多个人同时从表phones中随机取一条数据,如何避免他们取到同一条呢?
谢谢。
问题补充:7454103 写道表phones,有一个字段status,默认值为0,如果被取,则值改为1
你这个不是已经解决了嘛!
或者 在抓之前 把phones 的ID 拿出来 随机分配给 抓取的人 就不会冲突了!
就是担心,并发的时候,比如张三和李四同时读取phones 表,同时取到如号码为的同一条数据。因为他们取数据的一瞬间,的status状态为0
貌似可以用悲观锁
引用就是担心,并发的时候,比如张三和李四同时读取phones 表,同时取到如号码为的同一条数据。因为他们取数据的一瞬间,的status状态为0
解决方案:
& 表phones,有一个字段status,默认值为0,如果被取,则值改为1
这个是必须的!
然后把 抓取的那个方法:
& synchronized&& 同步下 就不会发生 抢号的事了!
同时读的话要 多线程加锁 然后判断字段status status=1 不取 再随机一个
表phones,有一个字段status,默认值为0,如果被取,则值改为1
你这个不是已经解决了嘛!
或者 在抓之前 把phones 的ID 拿出来 随机分配给 抓取的人 就不会冲突了!
已解决问题
未解决问题mysql如何随机抽取数据库里的几条数据
作者:用户
本文讲的是mysql如何随机抽取数据库里的几条数据,
数据库连接这些就不贴代码了,直接粘贴sql语句:
SELECT `title` , `id`
ORDER BY RAND( )
LIMIT 0 , 5;
数据库连接这些就不贴代码了,直接粘贴语句:
SELECT `title` , `id`
ORDER BY RAND( )
LIMIT 0 , 5;
随机从new表里取出5条数据,显示id和标题。
& select username from cdb_members order by rand() limit 0,5;
+-----------+
| username
+-----------+
| 狗狗请罪
| weike1130 |
+-----------+
5 rows in set (0.01 sec)
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;
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;
?最后在php中对这两个语句进行分别查询10次,
后者花费时间 0.147433 秒
前者花费时间 0.015130 秒
以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索数据库
数据库随机抽取数据、数据库随机抽取函数、mysql随机抽取数据、mysql 随机抽取、mysql数据库随机查询,以便于您获取更多的相关知识。
弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率
40+云计算产品,6个月免费体验
稳定可靠、可弹性伸缩的在线数据库服务,全球最受欢迎的开源数据库之一
云服务器9.9元/月,大学必备
云栖社区(yq.aliyun.com)为您免费提供相关信息,包括
,所有相关内容均不代表云栖社区的意见!欢迎访问CMS集中营! 本站QQ交流群:
&&|&& &&|&& &&|&&
当前位置: &
mysql获取随机数据的方法
mysql获取随机数据的方法
SELECT * FROM Member WHERE Country = &HK& ORDER BY RAND() limit 30
TAGS:  MySQL实现表中取出随机数据
以前在群里讨论过这个问题,比较的有意思.mysql的语法真好玩.他们原来都想用PHP的实现随机,但取出多条好像要进行两次以上查询.翻了手册,找到了下面这个语句,可以完成任务了。
SELECT * FROM table_name ORDER BY rand() LIMIT 5;
  rand在手册里是这么说的:
  RAND()
  RAND(N)
  返回在范围0到1.0内的随机浮点值。如果一个整数参数N被指定,它被用作种子值。
mysql& select RAND();
mysql& select RAND(20);
mysql& select RAND(20);
mysql& select RAND();
mysql& select RAND();
  你不能在一个ORDER BY子句用RAND()值使用列,因为ORDER BY将重复计算列多次。然而在MySQL3.23中,你可以做: SELECT * FROM table_name ORDER BY RAND(),这是有利于得到一个来自SELECT * FROM table1,table2 WHERE a=b AND c&d ORDER BY RAND() LIMIT 1000的集合的随机样本。注意在一个WHERE子句里的一个RAND()将在每次WHERE被执行时重新评估。
  但我试了一下,8千条记录的表,执行一次需要0.08 sec,.慢了些
  后来请教了google,得到如下代码
FROM table_name AS r1 JOIN
(SELECT ROUND(RAND() *
(SELECT MAX(id)
FROM table_name)) AS id)
WHERE r1.id &= r2.id
ORDER BY r1.id ASC
  执行效率需要0.02 sec.可惜的是,只有mysql 4.1.*以上才支持这样的子查询.
相关软件:
大小:1.93 MB
授权:免费
大小:62.51 MB
授权:免费

我要回帖

更多关于 mysql随机取数据 的文章

 

随机推荐