mysql 返回随机行_php – 从mysql数据库返回随机行而不使用rand()

我希望能够从数据库中提取15个左右的记录.我已经看到使用WHERE id = rand()可能会导致性能问题,因为我的数据库变大了.我见过的所有解决方案都是为了选择单个随机记录.我想得到倍数.

有谁知道为大型数据库执行此操作的有效方法?

编辑:

进一步编辑和测试:

我在使用MyISAM的新数据库上创建了一个相当简单的表.我给了这三个字段:autokey(无符号自动数字键)bigdata(一个大blob)和更多(一个中等int).然后我将随机数据应用到表中并使用Navicat运行一系列查询.结果如下:

查询1:按照rand()限制15从测试顺序中选择*

Query 2: select *

from

test

join

(select round(rand()*(select max(autokey) from test)) as val from test limit 15) as rnd

on

rnd.val=test.autokey;`

(我尝试了选择和选择不同,它没有明显的区别)

和:

Query 3 (I only ran this on the second test):

SELECT *

FROM (

SELECT @cnt := COUNT(*) + 1,

@lim := 10

FROM test

) vars

STRAIGHT_JOIN

(

SELECT r.*,

@lim := @lim - 1

FROM test r

WHERE (@cnt := @cnt - 1)

AND RAND(20090301) < @lim / @cnt

) i

ROWS: QUERY 1: QUERY 2: QUERY 3:

2,060,922 2.977s 0.002s N/A

3,043,406 5.334s 0.001s 1.260

我想做更多的行,所以我可以看到查询3如何缩放,但此刻,似乎明显的赢家是查询2.

在我完成此测试并声明答案之前,当我设置了所有这些数据和测试环境时,是否有人可以推荐任何进一步的测试?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值