でALLパフォーマンス:悪いUNION私は、次のような行を持つデータベースを持っているMySQLの
+------------+---------+------------+-------+
| continent | country | city | value |
+------------+---------+------------+-------+
| Asia | China | Beijing | 3 |
| ... | ... | ... | ... |
| N. America | USA | D.C | 7 |
| .... | .... | .... | .... |
ツリーマップの視覚化を生成するために、私は次のような形状を持つテーブルにこれを動作させる必要があります。
+-----+------------+-------+
| uid | parent-uid | value |
+-----+------------+-------+
Asia
はの「親」であり、これはBeijing
の「親」です。 China
ための「値」は、すべての子値の集計である必要が
+---------+--------+-----+
| Beijing | China | 3 |
| China | Asia | ... |
| Asia | global | ... |
+---------+--------+-----+
:だから、これらの3つのためにあなたのような何かを持っていると思います。同様に、Asia
の値はすべての子値の集合である必要があります。 SQLで純粋に、これを達成するために
私は、次の3つのクエリを作成し、UNION ALL
とそれらを組み合わせた:
# City-level:
SELECT
CONCAT(continent, "-", country, "-", city) as uid,
CONCAT(continent, "-", country) as parentuid,
value
FROM
table
UNION ALL
# Country-level
SELECT
CONCAT(continent, "-", country) as uid,
continent as parentuid,
SUM(value) as value
FROM
table
GROUP BY
country
UNION ALL
# Continent-level
SELECT
continent as uid,
"global" as parentuid,
SUM(value) as value
FROM
table
GROUP BY
continent
個々のクエリのそれぞれは、ミリ秒単位で完了します。都市レベル、国レベル、および大陸レベルのすべての返品結果< 0.01秒
私はこれらをすべて一緒に結合すると、突然結果が得られるのに8秒かかります!
私はそれがディスクトラッシングですので、それは一時的な結果テーブルを作成するための十分なRAMを持っていないかもしれないと考え(私はすでに午前)私は問題をグーグルで試してみたが、すべてはただ「UNION ALL
代わりのUNION
を使用してください」と言う
しかし、私はどのようにメモリの制限を増やすのか分からない。私は(1073741824)1ギガバイトにinnodb_buffer_pool_size
をぶつけてみましたが、それは
は、あなたはそれが結果セットの受け渡しやレンダリングをダウン物事を遅くしていませんクエリであることを確認していますか? –
テーブルの行数はいくつですか?出力の行数 –
どのくらいのRAMがありますか?どのバージョンのmysqlを使用していますか? (暗黙のテンポラリテーブルに問題がある可能性があります) –