3

非常に強力なハードウェア (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サーバーが完全に過負荷になる理由と、それを防ぐ方法はありますか?

よろしく、

4

2 に答える 2

3

http://www.mysqlperformanceblog.com/2006/07/12/insert-into-select-performance-with-innodb-tables/のように、SELECT INTO と LOAD DATA INFILE に切り替えることでこれを解決しました。私たちを正しい方向に導いてくれたランドルフ・ポッターに感謝します。

于 2010-02-25T09:51:06.543 に答える
1

これが原因かも?

注: DROP TABLE は、TEMPORARY キーワードを使用しない限り、現在アクティブなトランザクションを自動的にコミットします。

( http://dev.mysql.com/doc/refman/5.1/en/drop-table.html )

于 2009-09-12T10:48:39.007 に答える