mysql에서 테이블 최적화와 분석 테이블의 차이점은 무엇입니까?


29

mysql에서 테이블 최적화와 분석 테이블의 차이점은 무엇입니까? 온라인 문서를 읽었지만 차이점이 무엇인지 확실하지 않습니다.

답변:


28

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

MyISAM

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와 동일하지 않습니다. 차이점은 다음과 같습니다.

InnoDB ( innodb_file_per_table 사용 가능)

각 테이블의 데이터 및 인덱스는 외부 테이블 스페이스 파일에 저장됩니다. 들어 datadirIS /var/lib/mysql 테이블 mydb.mytable다음과 같이이를 저장됩니다 :

  • /var/lib/mysql/mydb/mytable.frm
  • /var/lib/mysql/mydb/mytable.ibd

OPTIMIZE TABLE mydb.mytable실행, mytable.ibd축소됩니다.

InnoDB ( innodb_file_per_table 비활성화)

/var/lib/mysql/mydb/mytable.frm존재하는 것입니다. 테이블의 모든 데이터 및 인덱스 페이지 mydb.mytable는 시스템 테이블 스페이스 파일에 저장됩니다 /var/lib/mysql/ibdata1.

OPTIMIZE TABLE mydb.mytable실행, 데이터와 인덱스 페이지는을 ibdata1에 연속적으로 기록됩니다. 불행하게도, 이것은 ibdata1이 비약적으로 성장하게합니다.

Percona CTO Vadim Tkachenko그림 표현 보기

InnoDB 배관

업데이트 2013-02-26 22:33 EST

당신은 코멘트했다

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 의 무익에 대한 게시물을 작성했습니다 .


innodb에 대한 최적화 테이블은 지원되지 않는다고 생각합니다. 메시지가 있는데 인덱스가 다시 생성됩니다. 어떻게 작동합니까?
부울

@RolandoMySQLDBA "당신은 실행할 수 없습니다 OPTIMIZE TABLE." 라고 말할 때 무슨 뜻인지 잘 모르겠습니다 . 이 때 OPTIMIZE TABLEInnoDB의 테이블에 대해, MySQL은이 수행 ALTER TABLE ... ENGINE=InnoDB하고 ANALYZE TABLE ...당신을 위해 작업을이 말할 때 "재 작성이 + 대신 테이블을 분석하고."
Michael-sqlbot

@ Michael-sqlbot 내 답변에서 볼 수 있듯이 OPTIMIZE TABLE dat;MySQL 5.5.29에서 실행 되었으며 즉시 불만을 표시했습니다 Table does not support optimize, doing recreate + analyze instead. 내가 추천하는 이유 ALTER TABLE dat ENGINE=InnoDB; ANALYZE TABLE dat;입니다.
RolandoMySQLDBA

맞습니다. 그러나 테스트 한 테이블이 매우 작기 때문에 즉시 발생했다고 주장합니다. 때를 OPTIMIZE TABLE이노에, 서버는 실제로 실제로 실행 않습니다 ALTER TABLE ... ENGINE=InnoDB그리고 ANALYZE TABLE당신은 참으로 실행할 수 있도록 ... 그 응답을 반환하기 전에 무대 뒤에서 OPTIMIZE TABLE이노에, 그리고 의도 한 효과를 얻을 수 있습니다.
Michael-sqlbot 2013

15

MySQL 및 스토리지 엔진 버전에 따라 다르지만 일반적으로 다음과 같습니다.

OPTIMIZE TABLE 테이블을 분석하고 테이블의 키 분배를 저장하며 사용되지 않은 공간을 회수하고 데이터 파일을 조각 모음합니다.

ANALYZE TABLE 테이블 만 분석하고 키 분포를 저장합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.