我有三个表,每个表包含一些常用信息,以及表中唯一的一些信息。
例如:uid
,date
在表中是通用的,但是一个表可以包含列type
,而另一个表包含currency
。
我需要查询数据库并获取已在所有三个表中输入的最后20个条目(date DESC
)。
我的选择是:
查询数据库一次,包含一个包含三个UNION ALL
子句的大型查询,并传递列的假值,IE:
FROM (
SELECT uid, date, currency, 0, 0, 0
以及稍后
FROM (
SELECT uid, date, 0, type, 0, 0
这会让我留下一些零值字段..
或者我可以三次查询数据库,并以某种方式在PHP sort
内通过信息获取最新的20个帖子。这会让我留下过多的信息 - 要查看的帖子(LIMIT 20
)* 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