답변:
@MitchWheat의 답변 을 확장하려면 (먼저 직접 응답하는 경우 +1) :
ANALYZE TABLE 은 키 분배를 검사하여 INFORMATION_SCHEMA.STATISTICS에 저장합니다.
OPTIMIZE TABLE 은일부 테이블 압축을 수행 한 후 ANALYZE TABLE 을 수행합니다. OPTIMIZE TABLE mydb.mytable;
테이블이 MyISAM인경우와 동일합니다.
ALTER TABLE mydb.mytable ENGINE=MyISAM;
ANALYZE TABLE mydb.mytable;
datadir의 MyISAM 테이블 mydb.mytable /var/lib/mysql
에는 다음 파일이 있습니다.
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.MYD
(데이터)/var/lib/mysql/mydb/mytable.MYI
(인덱스)OPTIMIZE TABLE mydb.mytable
테이블 의 .MYD
및 .MYI
파일을 축소 합니다.
이것은 InnoDB와 동일하지 않습니다. 차이점은 다음과 같습니다.
각 테이블의 데이터 및 인덱스는 외부 테이블 스페이스 파일에 저장됩니다. 들어 datadir
IS /var/lib/mysql
테이블 mydb.mytable
다음과 같이이를 저장됩니다 :
/var/lib/mysql/mydb/mytable.frm
/var/lib/mysql/mydb/mytable.ibd
때 OPTIMIZE TABLE mydb.mytable
실행, mytable.ibd
축소됩니다.
만 /var/lib/mysql/mydb/mytable.frm
존재하는 것입니다. 테이블의 모든 데이터 및 인덱스 페이지 mydb.mytable
는 시스템 테이블 스페이스 파일에 저장됩니다 /var/lib/mysql/ibdata1
.
때 OPTIMIZE TABLE mydb.mytable
실행, 데이터와 인덱스 페이지는을 ibdata1에 연속적으로 기록됩니다. 불행하게도, 이것은 ibdata1이 비약적으로 성장하게합니다.
Percona CTO Vadim Tkachenko 의 그림 표현 보기
당신은 코멘트했다
innodb에 대한 최적화 테이블은 지원되지 않는다고 생각합니다. 메시지가 있는데 인덱스가 다시 생성됩니다. 어떻게 작동합니까?
나는 이것을 시도했다
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.5.29 MySQL Community Server (GPL)
Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test
Database changed
mysql> create table dat (a int, primary key (a));
Query OK, 0 rows affected (0.08 sec)
mysql> insert into dat values (1),(2),(3),(4),(5),(6),(7),(8),(9),(10);
Query OK, 10 rows affected (0.04 sec)
Records: 10 Duplicates: 0 Warnings: 0
mysql> analyze table dat;
+----------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------+---------+----------+----------+
| test.dat | analyze | status | OK |
+----------+---------+----------+----------+
1 row in set (0.06 sec)
mysql> optimize table dat;
+----------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+----------+----------+----------+-------------------------------------------------------------------+
| test.dat | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| test.dat | optimize | status | OK |
+----------+----------+----------+-------------------------------------------------------------------+
2 rows in set (0.14 sec)
mysql>
당신이 올바른지. OPTIMIZE TABLE
단일 작업으로 실행할 수 없습니다 . InnoDB의 기능은 다음과 같습니다.
ALTER TABLE mydb.mytable ENGINE=InnoDB;
ANALYZE TABLE mydb.mytable;
이 단계를 직접 실행할 수도 있습니다.
그러나 정직 ANALYZE TABLE
하게도 쿼리가 실행될 때마다 InnoDB 스토리지 엔진은 인덱스의 페이지 통과를 기반으로 테이블 카디널리티에 대한 추정을 수행하므로 InnoDB 테이블에 대해 실행하지 않아도됩니다 . 의 높은 숫자가있는 경우 INSERTs
, UPDATEs
그리고 DELETEs
, 당신은 필요합니다 ANALYZE TABLE
. 때이 높은 번호 DELETEs
다음, ALTER TABLE mydb.mytable ENGINE=InnoDB;
테이블을 축소하기 위해 필요합니다.
실제로 ANALYZE TABLE
특정 경우에 InnoDB 의 무익에 대한 게시물을 작성했습니다 .
Oct 16, 2011
: 사이트가 다운되지 않도록 인덱스를 갑자기 다시 작성해야합니다.Jun 21, 2011
: MySQL Query Optimizer는 어디에서 인덱스 통계를 읽습니까?OPTIMIZE TABLE
." 라고 말할 때 무슨 뜻인지 잘 모르겠습니다 . 이 때 OPTIMIZE TABLE
InnoDB의 테이블에 대해, MySQL은이 수행 ALTER TABLE ... ENGINE=InnoDB
하고 ANALYZE TABLE ...
당신을 위해 작업을이 말할 때 "재 작성이 + 대신 테이블을 분석하고."
OPTIMIZE TABLE dat;
MySQL 5.5.29에서 실행 되었으며 즉시 불만을 표시했습니다 Table does not support optimize, doing recreate + analyze instead
. 내가 추천하는 이유 ALTER TABLE dat ENGINE=InnoDB; ANALYZE TABLE dat;
입니다.
OPTIMIZE TABLE
이노에, 서버는 실제로 실제로 실행 않습니다 ALTER TABLE ... ENGINE=InnoDB
그리고 ANALYZE TABLE
당신은 참으로 실행할 수 있도록 ... 그 응답을 반환하기 전에 무대 뒤에서 OPTIMIZE TABLE
이노에, 그리고 의도 한 효과를 얻을 수 있습니다.