【发布时间】:2011-03-24 19:06:00
【问题描述】:
我希望能够从数据库中提取 15 条左右的记录。我已经看到使用WHERE id = rand() 会导致我的数据库变大时出现性能问题。我见过的所有解决方案都旨在选择单个随机记录。我想得到倍数。
有人知道对大型数据库执行此操作的有效方法吗?
编辑:
进一步编辑和测试:
我在一个使用 MyISAM 的新数据库上制作了一个相当简单的表。我给了这 3 个字段:autokey(无符号自动数字键)bigdata(大块)和somemore(中等整数)。 然后我将随机数据应用于表并使用 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;`
(我尝试了 select 和 select distinct,但没有明显区别)
和:
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
行: 查询 1: 查询 2: 查询 3:
2,060,922 2.977s 0.002s 不适用
3,043,406 5.334s 0.001s 1.260
我想做更多行,以便查看查询 3 的扩展方式,但目前,似乎明显的赢家是查询 2。
在我结束这个测试并宣布答案之前,虽然我已经设置了所有这些数据和测试环境,有人可以推荐任何进一步的测试吗?
【问题讨论】: