【问题标题】:Retrieve min and max values from different tables with same strucure从具有相同结构的不同表中检索最小值和最大值
【发布时间】:2012-12-18 15:31:12
【问题描述】:

我有一些结构相同的日志表。每个表都与一个站点相关,并且有数十亿个条目。这种拆分的原因是为了进行快速高效的查询,因为 99.99% 的查询都与网站相关。

但是此时,我想检索这些表中某一列的最小值和最大值?

我无法编写 SQL 请求。我应该使用UNION吗?

我只是在寻找请求概念,而不是最终的 SQL 请求。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    您可以使用 UNION,是的。应该这样做:

    SELECT MAX(PartialMax) AS TotalMax
      FROM 
      ( SELECT MAX(YourColumn) AS PartialMax FROM FirstTable UNION ALL SELECT MAX(YourColumn) AS PartialMax FROM SecondTable ) AS X;
    

    如果您对要在其中找到 MAX 的列有索引,则应该具有非常好的性能,因为查询应该寻找该列上索引的末尾以非常快速地找到最大值。如果没有对该列的索引,则查询必须扫描整个表以找到最大值,因为没有任何东西固有地对其进行排序。

    添加了一些细节以解决对“大量查询”的担忧。

    我不确定您所说的“巨大”是什么意思。您可以创建一个为您执行 UNION 的 VIEW;然后,您使用视图,它会使查询变得非常小:

    SELECT MAX(YourColumn) FROM YourView;
    

    但这只是针对查询文本的大小进行了优化。为什么您认为为此进行优化很重要? VIEW 有助于维护——如果您添加或删除分区,只需适当地修复视图。但长查询文本应该不是问题。

    或者“巨大”,您是否担心查询将执行的 I/O 量?除了确保每个表在YourColumn 上都有一个索引以便可以非常快速地找到每个分区上的最大值之外,没有什么能起到这么大的作用。

    【讨论】:

    • 感谢您的回答。我有 14 个表,还有其他方法可以避免大量查询(14 UNION)吗?
    • 抱歉我迟到的回答。通过“巨大”,我会说在 14 个桌子上进行联合是一个很长而且不是很性感的要求。感谢您的更新。
    猜你喜欢
    • 1970-01-01
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 2016-10-14
    相关资源
    最近更新 更多