问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

有一个mysql的数据表,我要随机抽取10条记录,用什么方法最好。

发布网友 发布时间:2022-04-08 17:49

我来回答

2个回答

懂视网 时间:2022-04-08 22:10

复制代码

rand在手册里是这么说的:
RAND()
RAND(N)
返回在范围0到1.0内的随机浮点值。如果一个整数参数N被指定,它被用作种子值。

  1. mysql> select RAND();
  2.         -> 0.5925
  3. mysql> select RAND(20);
  4.         -> 0.1811
  5. mysql> select RAND(20);
  6.         -> 0.1811
  7. mysql> select RAND();
  8.         -> 0.2079
  9. mysql> select RAND();
  10.         -> 0.7888
复制代码

你 不能在一个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被执行时重新评估。

网上基本上都是查询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秒,速度也不错,但是跟上面的语句还是有很大差距
后来请教了baidu,得到如下代码
完整查询语句是:

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

最后在php中对这两个语句进行分别查询10次,
前者花费时间 0.147433 秒
后者花费时间 0.015130 秒

执行效率需要0.02 sec.可惜的是,只有mysql 4.1.*以上才支持这样的子查询.
注意事项 查看官方手册,也说rand()放在ORDER BY 子句中会被执行多次,自然效率及很低。

以上的sql语句最后一条,本人实际测试通过,100W数据,瞬间出结果。

MySQL随机获取数据的方法,支持大数据量

标签:

热心网友 时间:2022-04-08 19:18

1.通过MYSQL内置的函数来操作,具体SQL代码如下:
SELECT * FROM tablename ORDER BY RAND() LIMIT 10
2.不要将大量的工作给数据库去做,这样会导致数据库在某一集中并发时间内锁死并阻塞。
建议通过PHP随机生成一下1-X(总行数)之间的数字,然后将这10个随机数字作为查询条件,具体语句如:
SELECT * FROM tablename where ID in (2,8,4,11,12,9,3,1,33)
可能你还要进行重复排除,并且需要在程序中将10个值串联并连接进入SQL语句中。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
如何选手机号码才大吉好运发财的手机号码? 手机号码吉凶吉祥号富贵大吉的手机尾号有哪些? 鸽子吃卫生纸是缺什么 为什么鸽子不吃菜叶子而只吃玉米呢 电脑显示未安装evernote怎么回事请教高手我的印象笔记不能在台式电脑... 韩国是岛国吗 韩国最便宜的vps 电脑开机时出现rebootandselectproperbootdevice怎么办 reboot and sel... ...出现reboot and select proper boot device 高清的液晶电视最好的选择?? 老鼠吃什么药会死掉 吃什么药能使人脑死亡 我想知道吃什么药可以让人短暂的出现死亡状 吃什么西药可以死亡 吃什么药迅速死亡 2x2魔方教程是什么? 魔方公式B2是什么意思? 怎样找回以前的登录密码 如何找回以前的和密码 二式魔方的公式是什么 西门子多门冰箱的压缩机会发出声音么? 家中地暖地板漏水该怎么办 暖气水管漏水泡坏地板,找谁赔偿? 暖气管道上有结露烂了地板,该怎么办? 房子暖气漏水,地板被泡,墙面湿透,如何进行赔偿?急!!! 暖气漏水,木地板泡了水以后底下发霉了,现在正揭掉晾干,但霉味有点大,请问该怎么办?能不能洒些药?急 楼上装修,暖气漏水把我家的地板泡坏了,该怎样赔偿 新装的暖气第二个采暖季因管子漏水把地板泡了找商家解决商家不管怎么办? 家中暖气漏水,地板被泡,应由谁负责?很急! 请问衣服上被塑料黏上了怎么去除? 长期吃药~能快死吗? 现实中衰老濒临死亡的人有没有什么药物可以维持生命? 感冒后干咳喉咙痛,日夜都在咳像有异物作咽微痛作痒有几天了吃什么药快好难受死了 预防兔子的球虫病,吃什么药效果最好?用了磺胺氯呲嗪钠和地克珠利仍然控制不住死亡,这两种药可以常期用_百度问一问 歌词我好喜欢你 刘姓女孩 2008年农历二月十七午时出生 如何取名 求两年前听得到一首歌,女生唱的一首很纯净的歌,只记得歌词里面有飞机 f键的作用 郑国霖的个人资料? 电脑键盘f键代表什么 F键是做什么的? 使命召唤7连续使用F键什么意思 变蛋的蛋黄发绿能吃么 皮蛋里的黄没熟透能吃吗 皮蛋里面含有什么有害物质? 皮蛋 蛋白是黄色蛋黄是青黑色 能吃吗 河南变蛋为什么有黄心儿的有绿心儿的? 皮蛋是什么颜色 华为设置图案解锁 找不到 客厅宽度是3.5米左右(墙到墙),如坐在沙发看电视可能不到3米。请问60寸的电视合适吗。