MySQL UNION还是创建一个中间表?

时间:2012-07-23 23:24:58

标签: mysql union

我有两个表(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。我没有时间/能力对这两件事进行基准测试。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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

或者您可以LEFT JOIN(而不是UNION)两个表格users并在POW SUM内移动(SUM(Table_02.correct) + SUM(POW(Table_01.correct, 2))) AS points