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

MySQL 随机函数获取数据速度和效率分析

发布网友 发布时间:2022-04-22 10:46

我来回答

1个回答

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

在mysql中带了随机取数据的函数,在mysql中我们会有rand()函数,很多朋友都会直接使用,如果几百条数据肯定没事,如果几万或百万时你会发现,直接使用是错误的。下面我来介绍随机取数据一些优化方法。
SELECT
*
FROM
table_name
ORDER
BY
rand()
LIMIT
5;
rand在手册里是这么说的:
RAND()
RAND(N)
返回在范围0到1.0内的随机浮点值。如果一个整数参数N被指定,它被用作种子值。
mysql>
select
RAND();
->
0.5925
mysql>
select
RAND(20);
->
0.1811
mysql>
select
RAND(20);
->
0.1811
mysql>
select
RAND();
->
0.2079
mysql>
select
RAND();
->
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()来随机获取数据。
SELECT
*
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的论坛上有人使用
SELECT
*
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`)-(SELECT
MIN(id)
FROM
`table`))
+
(SELECT
MIN(id)
FROM
`table`)))
ORDER
BY
id
LIMIT
1;
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;
最后在php中对这两个语句进行分别查询10次,
前者花费时间
0.147433

后者花费时间
0.015130

执行效率需要0.02
sec.可惜的是,只有mysql
4.1.*以上才支持这样的子查询.
注意事项
查看官方手册,也说rand()放在ORDER
BY
子句中会被执行多次,自然效率及很低。
以上的sql语句最后一条,本人实际测试通过,100W数据,瞬间出结果。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
为什么来大姨妈胸会胀 少儿学什么舞蹈 青年学什么舞蹈好 成年人学什么舞蹈 福州企业最低工资标准 2013年厦门的底薪是多少 生产要素的需求有哪些性质 生产要素的需求有何特点? 什么是生产要素需求 微观经济学要素需求什么是条件要素需求?它和要素需求有什么不同?_百度... mysql中text类型字段对查询效率的影响有多大? mysql查询优化器应该怎么使用 Mysql多字段大表的几种优化方法 sql mysql数据库,提高mysql查询效率,及查询速度。提高网站速度 mysql时间类型查询的效率问题 mysql 查询语句性能和效率问题 mysql查询语句优化方法 提高mysql查询效率的方法有哪些 讲述mysql数据表几种有效优化方法 小米手机截屏在哪 女人来大姨妈不能吃什么,不能做什么 月经期间不宜吃什么 姨妈来了不能吃什么 大姨妈时不宜吃什么 两台电脑能用USB连接传输数据么? 如何通过USB数据线让两台电脑通讯传输数据 两台电脑用USB线连接,要咋弄才能互传数据? usb传输文件到电脑 两台电脑主机之间能否实现USB互联传输文件? 手机私密相册怎么查看 转转延长收货能延迟多长时间 转转延长收货用不了 转转上面几天自动确认收货? 转转优品怎么延长物流收货时间,快要到自动确认收货时间了,东西还没 转转,卖家怎么帮我延长收货时间? 离确认收货超时结束还剩1天时能延长收货时间吗 卖家设置了10天自动收款怎么延长收货时间? 鲁提辖拳打镇关西原文、翻译及赏析 梦见大蟒蛇咬我右膀子,然后我将七寸剁断分成两截? 寸寸地剁去是什么短语? 是谁发明了年这个东西直接将我们的生命寸寸地剁去联系上下文体会短文第五自然? LG34UM56怎么样?LG34UM56好吗 欠款多少可以定为老赖?? 欠钱不还多久会上黑名单 欠款多少会被强制执行 杂烩汤里面的鸡蛋糕是怎么做的呀?可以烧汤吃的 烧杂绘的蛋糕怎么做? 杂烩汤中的鸡蛋糕怎么做的? 怎样做大杂烩? 大杂烩做法