4

我有三个表,每个表都包含一些通用信息,以及表独有的一些信息。例如:uid,date在表中是通用的,但是一个表可以包含一列type而另一个包含currency。我需要查询数据库并获取date DESC已在所有三个表中输入的最后 20 个条目 ()。我的选择是:

  1. 查询数据库一次,用一个大查询,包含三个UNION ALL子句,并传递列的假值,IE:

    FROM    (
        SELECT  uid, date, currency, 0, 0, 0
    

    后来

    FROM    (
        SELECT  uid, date, 0, type, 0, 0
    

    这会给我留下分配空值字段..

  2. 或者我可以查询数据库 3 次,并以某种方式在 PHP 中sort通过信息获取最新的 20 个帖子。这会给我留下过多的信息 - 60 个帖子要浏览 ( LIMIT 20) * 3 - 并迫使我每次都执行某种类型的附加快速排序。

什么选择更好/任何替代想法?

谢谢。

4

3 回答 3

6

这两个选项比你说的更相似。

当您使用UNIONs 执行单个大型查询时,MySQL 仍将执行三个单独的查询,就像您在替代计划中建议的那样,然后将它们组合成一个结果。

因此,您可以让 MySQLLIMIT为您进行过滤(和),也可以自己进行。鉴于这种选择,让 MySQL 完成所有工作听起来更可取。

在结果集中有额外的列理论上可能会影响性能,但是结果集如此之小,如 20 行,我不希望它有任何可检测的影响。

于 2009-08-11T12:36:36.917 回答
0

这完全取决于您的桌子有多大。如果每个表都有几千条记录,你可以使用第一个解决方案(UNION),你会没事的。

在更大的桌子上,我可能会选择第二种解决方案,主要是因为它使用的资源 (RAM) 比 UNION 方式少得多,而且速度仍然相当快。

但我建议您考虑一下您的数据模型,并可能对其进行优化。您必须使用基于 UNION 的查询的事实通常意味着有优化的空间,通常通过合并三个表,并添加一个“类型”字段(名称根本不好,但您明白我的意思)。

于 2009-08-11T12:36:07.947 回答
0

如果您知道自己的限制,则可以限制每个查询,并且联合仅在少量数据上运行。这应该会更好,因为 mysql 将只返回 20 行,并且会使排序更快,然后你可以在 php 中......

select * from (
  SELECT  uid, date, currency, 0, 0, 0 from table_a order by date desc limit 20
  union
  SELECT  uid, date, 0, type, 0, 0  from table_b order by date desc limit 20
...
) order by date desc limit 20
于 2009-08-11T12:40:27.167 回答