문제

우리는 매우 강력한 하드웨어 (8 Xeon Cores, 8GB RAM 및 RAID10이 포함 된 HP DL360)에서 적당한 부하 (200-300 QPS)의 MySQL 서버를 실행합니다. 모든 테이블은 InnoDB이고 활성 데이터 세트는 할당 된 내에 적합합니다. innodb_buffer_pool_size.

데이터베이스는 정규화되고 구체화 된 뷰를 사용하여 데이터 세트를 평평하게하는 조인 수를 줄입니다. 데이터가 하루에 몇 번 배치로 추가되면 MV : S는 사용하여 재생됩니다. CREATE TABLE AS SELECT 복잡한 트리거를 사용하여 동적으로 업데이트되는 대신.

문제는 때때로 이것들이있는 동안이라는 것입니다 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;

선택에 대한 설명은 다음과 같은 것을 생성합니다.

+----+-------------+------------------+-------------+---------------+------------+---------+------------------------------+-------+-----------------------------+
| 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/ . 올바른 방향으로 우리를 보내 주신 Randolph Potter에게 감사드립니다.

다른 팁

이것이 원인 일 수 있습니까?

참고 : Drop Table은 임시 키워드를 사용하지 않는 한 현재 활성 트랜잭션을 자동으로 저장합니다.

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

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top