1

いくつかのスコア情報を保持している互いに同一の2つのテーブル(MySQL、InnoDB)があります。この2つからリーダーボードを作りたいです。表1のスコアは、表2に比べてワイト(^ 2)が多くなっています。

1つの戦略は、2つはUNIONステートメントを使用してSQLクエリを記述し、その場で結果を取得することです。もう1つは、別のテーブルを作成し、両方のテーブルからタイムリーにデータを挿入することです。(例: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の両方に2,000万を超える行があります。

PS。これら2つのことをベンチマークする時間/能力がありません。

4

2 に答える 2

1

UNION ALL一意の行をチェックしないため、クエリを高速化できます。

一部の集計をサブセレクト内に移動して、中間のデータ量を減らすこともできます (集計によって行数が減る場合)。

または、LEFT JOIN(の代わりにUNION)両方のテーブルをusersで移動POWSUM、で移動することもできます(SUM(Table_02.correct) + SUM(POW(Table_01.correct, 2))) AS points

于 2012-07-24T00:26:41.400 に答える
1

2 番目のテーブルを作成します。データをロードしたら、元のテーブルにトリガーを追加して、元のテーブルでの新しいレコードの作成時に新しいテーブルに挿入します。これにより、バッチを実行する必要がなくなります。

于 2012-07-23T23:36:31.037 に答える