2012-03-13 109 views
0

目前,我正在使用此查询在我的PHP脚本:如何对所选行进行排序(真正)随机?

SELECT * FROM `ebooks` WHERE `id`!=$ebook[id] ORDER BY RAND() LIMIT 125; 

该数据库将约2500排在最高大的,但我读过ORDER BY RAND()最终将处理时间慢下来作为数据数据库增长。

所以我正在寻找一种替代方法来查询我的问题,让事情顺利进行。

此外,我注意到ORDER BY RAND()并不是真正的随机化行,因为我经常看到它遵循某种模式,有时会一遍又一遍地重复。

是否有任何方法可以真正随机化行?

+3

'ORDER BY RAND()'减慢,不'RAND()'本身。 – hakre 2012-03-13 16:58:08

+2

AFAIK最好的方法是做随机PHP端。例如,如果你的ID是一致的,你可以从MySQL获得count(*),然后随机选择一些id。 – Robus 2012-03-13 16:58:31

+3

看看http://stackoverflow.com/questions/1823306/mysql-alternatives-to-order-by-rand – a1ex07 2012-03-13 16:59:17

回答

1

RAND()功能是一个伪随机数生成器,如果你不使用不同的值初始化它会给你相同的数字序列,所以你应该做的是:

SELECT * FROM `ebooks` WHERE `id`!=$ebook[id] ORDER BY RAND(UNIX_TIMESTAMP()) LIMIT 125; 

将种子从当前时间的随机数发生器,并会给你一个不同的数字序列。

RAND()会减慢SELECTORDER BY子句,因为它必须每次都生成一个随机数然后按它排序。我建议你将数据返回给调用程序,并使用array_rand之类的东西随机化。

+2

但unix_timestamp的粒度为1秒,所以你只会得到一个不同的序列,如果有>每次查询运行1秒钟。 – 2012-03-13 17:04:55

+1

这可能导致在查询中提供其他一些经过强化编码的值或坚持秒,这实际上会使查询可缓存,这取决于使用领域。 – hakre 2012-03-13 17:07:16

+1

@MarcB我提供了一个简单的方法来解决这个问题。您当然使用'gettimeofday'并计算自epoch以来的微秒数并使用它,但是如果您需要在一秒钟内将多个随机集返回到同一个会话中,我会在缓存数据集中执行此操作,而不是每次都调用查询。 – Karlson 2012-03-13 17:11:21