MySQL性能 - 多个查询或一个低效查询?

时间:2009-08-11 12:29:27

标签: php mysql performance union

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

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

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

    以及稍后

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

    这会让我留下一些零值字段..

  2. 或者我可以三次查询数据库,并以某种方式在PHP sort内通过信息获取最新的20个帖子。这会让我留下过多的信息 - 要查看的帖子(LIMIT 20)* 3 - 并强迫我每次都要执行某种类型的附加快速搜索。

  3. 哪种选择更好/任何其他想法?

    感谢。

3 个答案:

答案 0 :(得分:5)

这两个选项比听起来更相似。

当您使用UNION执行单个大型查询时,MySQL仍将执行三个单独的查询,就像您在替代计划中提出的那样,然后将它们合并为一个结果。

所以,你可以让MySQL为你做过滤(和LIMIT),或者你可以自己做。鉴于这种选择,让MySQL完成所有工作听起来更为可取。

在结果集中有额外的列理论上可能会影响性能,但是如果结果集的结果设置为20行,我不会指望它会产生任何可检测的影响。

答案 1 :(得分:0)

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

在较大的表格上,我可能会选择第二种解决方案,主要是因为它使用的资源比UNION方式少得多,而且速度相当快。

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

答案 2 :(得分: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