MySQL을 선택하여 테이블을 작성하십시오
-
06-07-2019 - |
문제
우리는 매우 강력한 하드웨어 (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은 임시 키워드를 사용하지 않는 한 현재 활성 트랜잭션을 자동으로 저장합니다.