【问题标题】:MySQL UNION or Create an intermediate Table?MySQL UNION 还是创建中间表?
【发布时间】:2012-07-22 05:55:06
【问题描述】:

我有两个表(MySQL,InnoDB),它们彼此相同,包含一些分数信息。我想从这两者中创建一个排行榜。 与表 2 相比,表 1 中的分数具有更多的重量 (^2)。

一种策略是使用 UNION 语句编写 SQL 查询并即时获取结果,另一种策略是创建另一个表并及时将两个表中的数据插入到该表中。 (例如 Cron-Job)

我的问题是这个 UNION 查询会有多贵?

SELECT 
    username,
    specialId,
    SUM(correct) points,
    IFNULL((SUM(foracc) / SUM(completegames)), 0) accuracy
FROM
    ((SELECT 
        u.username,
        u.specialId,
        POW(p.correct, 2) as correct,
        p.correct as foracc, #to calcuate accuracy
        p.completegames
    FROM
        Table_01 p
    LEFT JOIN users u ON u.userid = p.userid
    WHERE
        p.year = 2012 AND p.type = 1) UNION (SELECT 
        u.username,
        u.specialId,
        p.correct,
        p.correct as foracc, #to calcuate accuracy
        p.completegames
    FROM
        Table_02 p
    LEFT JOIN users u ON u.userid = p.userid
    WHERE
        p.year = 2012 AND p.type = 1)) AS Table_aggregatedscore
GROUP BY 1
ORDER BY points DESC , acc DESC
LIMIT 10;

Table_01 和 Table_02 都有超过 2000 万行。

PS。我没有时间/能力对这两件事进行基准测试。

【问题讨论】:

    标签: mysql union


    【解决方案1】:

    UNION ALL 不检查唯一行,因此可以加快查询速度。

    您还可以在子选择中移动一些聚合以减少中间数据量(以防您的聚合减少行数)。

    或者你可以LEFT JOIN(而不是UNION)两个表都带有users,并将POW移动到SUM(SUM(Table_02.correct) + SUM(POW(Table_01.correct, 2))) AS points中。

    【讨论】:

      【解决方案2】:

      建立第二个表。加载数据后,在原始表上添加一个触发器,以便在任一原始表中创建新记录时插入到新表中,这样您就不必运行批处理。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-11
        • 1970-01-01
        • 2014-08-19
        • 2015-11-01
        • 1970-01-01
        • 2016-11-27
        相关资源
        最近更新 更多