MySQL UNION 或创建中间表?

标签 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 万。

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

最佳答案

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

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

或者您可以LEFT JOIN(而不是UNION)两个包含users 的表并将POW 移动到SUM, (SUM(Table_02.correct) + SUM(POW(Table_01.correct, 2))) AS points.

关于MySQL UNION 或创建中间表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11621980/

相关文章:

mysql - 帮助从 MySQL 触发器中删除别名

mysql - 是否可以从文件中选择mysql记录?

javascript - 使用导致错误 SQL 语法的变量添加限制

mysql - 在 MYSQL 和 UNION 中生成日期范围

java - Java中两个对象包的联合

mysql - 组合这些 mySQL 查询

mysql - 获取触发器以仅在审计表中插入更改的列值

python - 使用Python以MySQL json列格式插入Json数据

Postgresql - 按列组分组

php - ORDER BY 在 PHP/MySQL 中未按预期工作