我已经阅读了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) 我希望能够从数据库中提取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) 我有代码从数据库生成四辆汽车及其照片:
$l=$database->query("SELECT car,brand,exactprice FROM $table ORDER BY rand() LIMIT 4");
$buffer="";
foreach($l as $l){
$buffer.="<li><h3>{$l['car']}</h3><p>Price {$l['exactprice']}</p>";
$k=$database->query("SELECT logo FROM logo WHERE brand='{$l['brand']}'");
$buffer.="<img src='{$base_addr}/{$k[0]['logo']}'><br>";
}
Run Code Online (Sandbox Code Playgroud)
这是我目前的代码.我可以重写我的MySQL命令,所以我会logo从logo第一个选择中获得吗?
目前加载此页面需要4.32秒.