可能重复:
MySQL: Alternatives to ORDER BY RAND()
目前,我有一个以ORDER BY RAND(HOUR(NOW())) LIMIT 40结尾的查询,以获得40个随机结果。结果列表每小时更改一次。
这会扼杀查询缓存,这会损害性能。
,你能建议另一种方法来获得随机(Ish)结果集,不时变化吗?它不必是每一个小时,也不一定是完全随机的。
我更喜欢随机结果,而不是对表中的任意字段进行排序,但作为最后手段,我会这样做.
(这是一个新产品的列表,我想时不时地调整一下)。
发布于 2009-12-08 17:23:06
我认为更好的方法是将产品标识符下载到中间层,在需要时随机选择40个值(每小时一次或每个请求一次),并在查询:product_id in (@id_1, @id_2, ..., @id_40)中使用它们。
发布于 2009-12-08 16:32:42
如果您有ID列,最好执行以下操作:
-- create a variable to hold the random number
SET @rownum := SELECT count(*) FROM table;
SET @row := (SELECT CEIL((rand() * @rownum));
-- use the random number to select on the id column
SELECT * from tablle WHERE id = @row;选择随机id数的逻辑可以移动到应用程序级别。
SELECT * FROM table ORDER BY RAND LIMIT 40效率很低,因为MySQL将处理表中的所有记录,对所有行执行完整的表扫描,将它们随机排序。
发布于 2009-12-08 16:30:16
它将关闭缓存,因为每次都需要不同的结果集。您不可能缓存一组随机值。如果要缓存一组结果,请缓存大量随机值集,然后在要使用这些值的子部分内,在sql之外的较小集合内进行随机抓取。
https://stackoverflow.com/questions/1868102
复制相似问题