非常に強力なハードウェア (8 Xeon コア、8Gb RAM、および RAID10 を備えた HP DL360) で中程度の負荷 (200-300 QPS) で MySQL サーバーを実行しています。すべてのテーブルは innodb であり、アクティブなデータセットは割り当てられた 内に収まりますinnodb_buffer_pool_size
。
データベースは正規化されており、結合の数を減らすためにマテリアライズド ビューを使用してデータセットをフラット化します。データは 1 日に数回バッチで追加されるため、CREATE TABLE AS SELECT
複雑なトリガーを使用して動的に更新する代わりに、MV: を使用して再生成されます。
問題は、これらの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
サーバーが完全に過負荷になる理由と、それを防ぐ方法はありますか?
よろしく、