【问题标题】:Multiple 'Select column where ...' vs Select all the column多个“选择列...”与选择所有列
【发布时间】:2013-06-02 16:39:28
【问题描述】:

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

最好随机生成4个id并执行4个请求'select column from database where id = ...'

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

【问题讨论】:

  • 您想从数据库中随机选择 4 行吗?最好在一个请求中选择它们。
  • 您到底想达到什么目的?你有任何代码要显示吗?您现在使用哪种方法,为什么?

标签: php mysql performance


【解决方案1】:

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

【讨论】:

  • 取决于 ID 的命名法,OP 可能必须从整个表中预取一个 ID 列表,随机选择 4 个,然后重新查询数据库;) 像这样- stackoverflow.com/questions/4329396/…
  • 是的,但这可能比获取所有记录然后随机选择 4 条更有效,除非多个查询的成本非常高(即高延迟)。
  • 啊,我想我错误地使用了重新查询这个词 - 我的意思是,您将当前数据库加入回自身,但这是通过加入从同一数据库中随机选择的 ID 列表来完成的(请参阅我之前评论中的链接)
【解决方案2】:

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

完成所有这些逻辑后,将选择移至 MySQL 是明智之举:

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

您必须了解,这在 mysql 中 很慢,但是您在应用程序逻辑中获得了速度增益,并且可以确保在整个表中获得均匀的随机值。

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

【讨论】:

  • 在 php 中选择所有行并使用 rand 是否比按 rand 排序更快?
  • @user2409399 我更新了我的答案并用“php”重新标记了你的问题
  • php 中带有 rand() 的巨大查询?有 4 个 ID?
  • @bestprogrammerintheworld 是的。在 select 4 之前获取所有可用 Id 的巨大查询。
  • @ZsoltSzilagy - 是的,但这取决于表中有多少个 id?
【解决方案3】:

虽然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 年提出)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2011-08-23
    • 2020-03-21
    • 1970-01-01
    相关资源
    最近更新 更多