Php ORDER BY RAND()的性能命中率?

Php ORDER BY RAND()的性能命中率?,php,mysql,Php,Mysql,可能重复: 在一个包含1000~2000条记录的表中,我随机抽取了大约20行,大部分或全部都带有WHERE子句。这不会有太大的增长,也许每年会增长150 我最多也会看到几千个用户,但这个查询是网站热门领域的一部分 我真的需要关注ORDER BY RAND()的性能影响吗?我听过所有关于性能问题的恐怖故事,但当这样一个小桌子不断被击中时,我没有发现太多 我无法对此进行缓存。按兰德排序()很容易被使用和遗忘,但您必须意识到MySQL需要检查每一行,因为兰德()不是常数 检查1000行应该不是问题,

可能重复:

在一个包含1000~2000条记录的表中,我随机抽取了大约20行,大部分或全部都带有WHERE子句。这不会有太大的增长,也许每年会增长150

我最多也会看到几千个用户,但这个查询是网站热门领域的一部分

我真的需要关注ORDER BY RAND()的性能影响吗?我听过所有关于性能问题的恐怖故事,但当这样一个小桌子不断被击中时,我没有发现太多

我无法对此进行缓存。

按兰德排序()很容易被使用和遗忘,但您必须意识到MySQL需要检查每一行,因为兰德()不是常数

检查1000行应该不是问题,但要注意查询性能随时间的变化。如果您只需要一条记录,您可以在此处找到答案:

编辑

您说过不能进行缓存,但即使是生成的一个小.php文件也是缓存:)

例如,您可以将ID列表存储在缓存中;每次插入或删除数据库记录时都会对其进行更新。然后,使用PHP提取20个随机ID,并使用这些ID查询数据库(使用(4、7、10、45等)中的

更新


正如OP所指出的,如果查询也有条件(即不是表中的每一项都可以删除),这是不可能的。

orderbyrand()
从定义上讲是性能最差的解决方案。这并不意味着它太慢。在你的情况下,它显然性能足够。你需要担心吗?嗯,显然不需要。直到你担心。对于被愚弄者,我在提出这个问题之前已经浏览了这个问题。它没有涵盖我所关心的完全相同的问题关于一个小桌子的效率,它经常被点击,但更新不多。@deceze:我这样问是因为它是性能最差的解决方案,但也是我所做的最简单的解决方案。但是我不想变成一个数据库虐待狂。我基本上是在为这个特殊情况寻找最好的答案,因为我无法达到一个conc结论:好吧,结果被拉入一个PHP数组,作为游戏的一部分使用,这就是为什么我说它不能被缓存。比如说,每一个新游戏,每一个电脑玩家,它都是这样做的。对于缓存,我或多或少是说我不能生成并存储它们,所以psuedorandom?不管是哪种方式,结果都需要对照其他电脑玩家进行检查,这就是为什么它不可能发生的原因。不幸的是,每个电脑播放器需要20个随机行。我也考虑过使用偏移量,但一次只能拉一张记录,这似乎会降低性能。可能更进一步?您可以创建一个只包含ID的小缓存。插入或删除新记录时只需更新缓存即可。在PHP中,您只需拉取20,然后使用它在DB中查找(在
操作符中使用
),如果表只有八列宽,其中六列是tinyint,那么是否值得这样做?此外,WHERE语句中至少需要使用上述两列。@omgworm如果您已经在使用
WHERE
WHERE,那么行数已经减少了。。。