我希望能够从数据库中取回15条左右的记录。我已经看到,使用WHERE id = rand()会导致性能问题,因为我的数据库变得更大。我所见过的所有解决方案都适用于选择一个随机记录。我想获得倍数。从mysql数据库返回随机行而不使用rand()
有谁知道有效的方法来做到这一点的大型数据库?
编辑:
进一步编辑和测试:
我使用的MyISAM做了一个非常简单的表格,一个新的数据库上。我给了这3个字段:autokey(无符号自动数字键)bigdata(一个大的斑点)和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;`
(我试过两个选择,选择不同的和它并没有明显的差异)
和:
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。
我之前包裹了这个测试,并宣布一个答案,而我拥有所有这些数据和测试环境的搭建,任何人都可以提出任何进一步的测试?
+0
这些可能会有所帮助:http://stackoverflow.com/questions/142242/what-是最好的方式来挑选一个随机排从一个表在MySQL中,http://stackoverflow.com/questions/1244555/how-can-i-optimize-mysqls- order-by-rand-function,http://stackoverflow.com/questions/1868102/order-by-rand-alternative –
2010-08-03 15:12:06