多个'选择列在哪里...'vs选择所有列

时间:2013-06-02 16:39:28

标签: php mysql performance

我必须从列中随机选择4行。

最好是从数据库中随机生成4个id和执行4个请求的select列,其中id = ...'

或者选择一个请求中的所有行并选择之后?

3 个答案:

答案 0 :(得分:0)

如果你能够生成随机的现有id,我认为最好的方法是使用类似where id in (id1, id2, id3, id4)的子句。这将导致在一个查询中获得4条记录,因此不会获取不必要的查询或记录。

答案 1 :(得分:0)

如前所述,where id in (id1, id2, id3, id4)是从MySQL角度来看最快的方法。但是,在生成这些ID的应用程序中需要一些逻辑:所有4个ID都应该存在,随机分布,并且您希望避免重复。在最坏的情况下,您将使用大量查询检索所有existend ID的列表,提取4个随机值,然后再次查询。

要完成所有这些逻辑,将选择移到MySQL中是明智的:

SELECT * FROM foobar
ORDER BY RAND()
LIMIT 4;

你必须明白mysql中的 速度很慢,但你在应用程序逻辑中有一个速度提升,并且可以确保在你的桌子上获得随机值。

编辑: 该评论询问PHP是否紧跟此任务,然后是MySQL。答案是否定的。 它不是通过“使用rand”来完成的。您需要在PHP中包含一个包含所有这些ID的数组。这是一个巨大的查询,大量的TCP流量,巨大的数组将在PHP中构建,巨大的btree将由zend引擎构建。然后,使用ID,您必须触发第二个查询以获取这些ID的行。

答案 2 :(得分:0)

虽然RAND()功能可能很慢,但到目前为止我还没有遇到速度方面的重大问题。我的策略实际上是将数据库加回到自身的查询中,返回带有限制的随机ID列表。

SELECT *
FROM table AS t1
JOIN (
    SELECT rowID
    FROM table
    ORDER BY RAND()
    LIMIT 4
) AS t2
WHERE t1.rowID = t2.rowID

还有一个更强大的解决方案 - 尝试查看this question(2010年询问)。