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


97

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

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

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

답변:


190

정말 정보 메시지입니다.

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

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

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

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

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

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

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


13
좋아, 지금하고있는 다른 방식을 공유해 주시겠습니까?
Vikrant More

이것이 MySQL Reference Manual 어딘가에 있다고 확신합니다. 이것은 예상되는 동작이며 걱정할 필요가 없습니다. (단, 테이블이 "잠기고"프로세스가 완료 될 때까지 사용할 수 없습니다. HUGH JASS 테이블의 경우 시간이 걸릴 수 있습니다.) 참조 : https://dev.mysql.com/doc/refman/5.5/ en / optimize-table.html "InnoDB 세부 정보"섹션을 참조하십시오.
spencer7593

MySQL Workbench를 사용하여 테이블 최적화를 수행 할 수도 있습니다. 추가 정보 는 Schema and Table Inspector 문서 를 참조하십시오 . "테이블 최적화"옵션을 확인하십시오.
Philip Olson 2015 년

1
db 세계에서 시작하는 사람들을위한 훌륭한 설명. 대단히 감사합니다
tachomi

5
주의-디스크 공간이 부족하면 서버가 매우 큰 테이블을 다시 만들려고 할 수 있으므로 사용하지 마십시오.
대니 스테이플

22

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                                                                |
+----------+----------+----------+-------------------------------------------------------------------+

2
실제로 MySQL은 실패 이유를 제공합니다 : 임시 파일 쓰기 실패, 작업 실패.
iwind

8

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

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>;

2
이 방법은 인덱스와 트리거를 유지합니까?
조엘 머피

1
네, 물론입니다. 그들 모두! 당신은 그것을 시도하고 다시 확인을 위해 phpMyAdmin을 사용할 수 있습니다
tquang

1
이것은 외래 키를 다시 생성하지 않습니다.
DanB

1

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


3
대답과 함께 예제 코드를 작성하는 것이 좋습니다. 내가 좋은 답변을 작성하는 방법을
Frits
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.