[mysql] “테이블이 최적화를 지원하지 않고 대신 재생성 + 분석을 수행함”은 무엇을 의미합니까?

MySQL 5.5에서 작업 중이며 OPTIMIZE TABLE쿼리를 사용하여 인덱스를 다시 작성하려고 합니다. 아래 오류가 발생합니다.

테이블은 최적화를 지원하지 않고 대신 재생성 + 분석을 수행합니다.

이것은 무엇을 의미 하는가? MySQL 엔진이 Index Rebuild를 허용하지 않습니까? 이 메시지 뒤에서 MySQL 5.5 엔진 수준에서 수행되는 작업은 무엇입니까?



답변

정말 정보 메시지입니다.

아마도 InnoDB 테이블 ( MyISAM 스토리지 엔진이 아닌 InnoDB 스토리지 엔진을 사용하는 테이블) 에서 OPTIMIZE를 수행하고있을 것 입니다.

InnoDB는 MyISAM처럼 OPTIMIZE를 지원하지 않습니다. 뭔가 다른 일을합니다. 빈 테이블을 만들고 기존 테이블의 모든 행을 여기에 복사하고 기본적으로 이전 테이블을 삭제하고 새 테이블의 이름을 바꾼 다음 ANALYZE를 실행하여 통계를 수집합니다. 이것이 InnoDB가 최적화를 수행하는 데 가장 가깝습니다.

당신이 얻는 메시지는 기본적으로 InnoDB 스토리지 엔진이 MySQL 서버에 말한 것을 반복하는 MySQL 서버입니다.

최적화를 지원하지 않는 테이블은 InnoDB 스토리지 엔진에서 다음과 같이 말합니다.

“나 (InnoDB 스토리지 엔진)는 내 친구 (MyISAM 스토리지 엔진)처럼 최적화 작업을 수행하지 않습니다.”

“대신 재생성 + 분석 수행” 은 InnoDB 스토리지 엔진에서 다음과 같이 말합니다.

” 동등한 결과를 얻을 수있는 다른 작업 을 수행하기로 결정했습니다 .”


답변

OPTIMIZE TABLE공식 지원 문서에 따르면 InnoDB 엔진에서 잘 작동합니다. http://dev.mysql.com/doc/refman/5.5/en/optimize-table.html

InnoDB 테이블 최적화는 테이블 구조를 재 구축하고 인덱스 통계 (예 :)를 업데이트 ALTER TABLE합니다.

이 메시지는 정보 용으로 만 언급 될 수 있으며 매우 중요한 정보는 쿼리의 상태입니다. 그냥 OK!

mysql> OPTIMIZE TABLE foo;
+----------+----------+----------+-------------------------------------------------------------------+
| Table    | Op       | Msg_type | Msg_text                                                          |
+----------+----------+----------+-------------------------------------------------------------------+
| test.foo | optimize | note     | Table does not support optimize, doing recreate + analyze instead |
| test.foo | optimize | status   | OK                                                                |
+----------+----------+----------+-------------------------------------------------------------------+


답변

가장 좋은 옵션은 동일한 속성으로 새 테이블을 만드는 것입니다.

CREATE TABLE <NEW.NAME.TABLE> LIKE <TABLE.CRASHED>;
INSERT INTO <NEW.NAME.TABLE> SELECT * FROM <TABLE.CRASHED>;

NEW.NAME.TABLE 및 TABLE.CRASH 이름 변경

RENAME TABLE <TABLE.CRASHED> TO <TABLE.CRASHED.BACKUP>;
RENAME TABLE <NEW.NAME.TABLE> TO <TABLE.CRASHED>;

잘 작업 후 삭제

DROP TABLE <TABLE.CRASHED.BACKUP>;


답변

더 나은 옵션은 새 테이블을 만들고 행을 대상 테이블에 복사하고 실제 테이블을 삭제하고 새로 만든 테이블의 이름을 바꾸는 것입니다. 이 방법은 작은 테이블에 적합합니다.


답변