我已经阅读了MySQL ORDER BY RAND()函数的一些替代方法,但大多数替代方案仅适用于需要单个随机结果的位置.
有没有人知道如何优化返回多个随机结果的查询,例如:
SELECT u.id,
p.photo
FROM users u, profiles p
WHERE p.memberid = u.id
AND p.photo != ''
AND (u.ownership=1 OR u.stamp=1)
ORDER BY RAND()
LIMIT 18
Run Code Online (Sandbox Code Playgroud) 从大型mysql表中选择随机行的快速方法是什么?
我在php工作,但我对任何解决方案感兴趣,即使它是用另一种语言.
我环顾四周,似乎没有任何简单的方法来做到这一点.几乎看起来只是抓住一部分记录并在代码中进行所有随机化(perl)更容易.我在网上看到的方法看起来更像是数十万,但肯定不是数百万.
我正在使用的表有600万条记录(并且正在增长),ID会自动递增,但并不总是存储在表中(非无间隙).
我已经尝试过推荐的LIMIT 1查询,但查询需要永远运行 - 考虑到记录中存在空白,有没有快速的方法来执行此操作?我不能只采取最大值并随机化范围.
更新:
我的一个想法可能是获取最大值,根据最大值随机化一个限制,然后从random_limit_1到random_limit_2获取10个记录的范围,然后获取在该范围内找到的第一个记录.
或者,如果我知道最大值,有没有办法我可以选择说出表的第5条记录,而不必知道它是哪个ID.然后抓住该记录的id.
更新:
这个查询有点快 - ish.仍然不够快= /
SELECT t.id FROM table t JOIN (SELECT(FLOOR(max(id) * rand())) as maxid FROM table) as tt on t.id >= tt.maxid LIMIT 1
Run Code Online (Sandbox Code Playgroud) 我希望能够从数据库中提取15个左右的记录.我已经看到WHERE id = rand()随着数据库变大,使用会导致性能问题.我见过的所有解决方案都是为了选择单个随机记录.我想得到倍数.
有谁知道为大型数据库执行此操作的有效方法?
编辑:
进一步编辑和测试:
我在使用MyISAM的新数据库上创建了一个相当简单的表.我给了这3个字段:( autokey无符号自动数字键)bigdata(大blob)和somemore(中等int).然后我将随机数据应用到表中并使用Navicat运行一系列查询.结果如下:
Query 1: select * from test order by rand() limit 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;`
Run Code Online (Sandbox Code Playgroud)
(我尝试了选择和选择不同,它没有明显的区别)
和:
Query 3 (I only ran this on the second test):
SELECT *
FROM (
SELECT @cnt := COUNT(*) + 1,
@lim := 10
FROM test
) vars
STRAIGHT_JOIN …Run Code Online (Sandbox Code Playgroud) 我有一个包含四列的MySQL表submited_name, submited_URL, submited_type, uniqueID.在这张表中我有大约1000条记录.我需要选择10个随机条目.问题是我需要将选定的随机值拆分为单独的PHP数组.每列一个.我的数组看起来像这样:
$ten_random_names = array ('name26', 'name55', 'name107', ect.);
$ten_random_URL = array ('url for name26', 'url for name55', 'url for name107', ect..);
$ten_random_types = array ('type for name26', 'type for name55', 'type for name107', ect..);
Run Code Online (Sandbox Code Playgroud)