MySQLを殺すCREATE TABLE AS SELECT
-
06-07-2019 - |
質問
非常に強力なハードウェア(8 Xeonコア、8Gb RAM、RAID10を備えたHP DL360)上で、適度な負荷(200-300 QPS)でMySQLサーバーを実行します。すべてのテーブルはinnodbであり、アクティブなデータセットは割り当てられた innodb_buffer_pool_size
に収まります。
データベースは正規化されており、結合の数を減らすために、マテリアライズドビューを使用してデータセットをフラット化します。複雑なトリガーを使用して動的に更新するのではなく、 CREATE TABLE AS SELECT
を使用してMV:sを1日に数回バッチで追加します。
問題は、これらの CREATE
クエリの実行中に(それぞれに5〜50秒かかります)サーバーへの他の無関係なクエリが CREATEの背後でキューに入れられるように見えることです。
クエリ。データベースが応答しなくなります。
MV:sを(再)生成するには、次のようなものを使用します:
BEGIN TRANSACTION;
DROP TABLE IF EXISTS TableName_TMP;
CREATE TABLE TableName_TMP ENGINE=INNODB CHARACTER SET utf8 COLLATE utf8_swedish_ci AS
SELECT about100columns, and10Expressions
FROM Table1
JOIN Table2 ON Table1.fk = Table2.pk
/* join up to 13 other tables */
WHERE ((removed IS NULL OR removed = 0))
ORDER BY created DESC, id ASC;
ALTER TABLE TableName_TMP ADD PRIMARY KEY(id), INDEX(created);
DROP TABLE IF EXISTS TableName;
ALTER TABLE TableName_TMP RENAME TO TableName;
COMMIT;
SELECTのEXPLAINは次のようなものを生成します:
+----+-------------+------------------+-------------+---------------+------------+---------+------------------------------+-------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------+-------------+---------------+------------+---------+ ------------------------------+-------+-----------------------------+
| 1 | SIMPLE | Table1 | ref_or_null | removed | removed | 5 | const | 76093 | Using where; Using filesort |
| 1 | SIMPLE | Table2 | eq_ref | PRIMARY | PRIMARY | 4 | Table1.fk1 | 1 | |
| 1 | SIMPLE | Table3 | eq_ref | PRIMARY | PRIMARY | 4 | Table1.fk2 | 1 | |
/* More of the same */
| 1 | SIMPLE | TableN | eq_ref | PRIMARY | PRIMARY | 4 | TableM.fk | 1 | Using index |
| 1 | SIMPLE | TableX | eq_ref | PRIMARY | PRIMARY | 4 | TableY.fk | 1 | |
/* More of the same */
+----+-------------+------------------+-------------+---------------+------------+---------+------------------------------+-------+-----------------------------+
CREATE TABLE AS
がサーバーを完全にオーバーロードする理由と、それを防ぐ方法はありますか?
よろしく、
解決
http://www.mysqlperformanceblog.com/2006/07/12/insert-into-select-performance-with-innodb-tables/ 。正しい方向に私たちを送ってくれたランドルフ・ポッターに感謝します。
他のヒント
これが原因である可能性がありますか?
注:TEMPORARYキーワードを使用しない限り、DROP TABLEは現在アクティブなトランザクションを自動的にコミットします。
( http://dev.mysql.com/ doc / refman / 5.1 / en / drop-table.html )