MySQL DB 서버에서 OPTIMIZE TABLE 쿼리 실행의 이점


9

OPTIMIZE TABLE tbl_nameMySQL 서버 에서 쿼리를 실행하여 얻을 수있는 실질적인 이점이 무엇인지 알고 싶습니다 .

나는 이것을 한 번 확인하고 이것이 실행 된 후 다음 DB 적중에 시간이 오래 걸리는 조각의 재배치 때문일 수 있지만 후속 적중은 일종의 성능을 보여 주므로 쿼리 캐싱 이이 트릭을 수행하는지 확실하지 않습니다. 최적화 또는 최적화 만으로이 트릭을 수행합니다.

MySQL에서 작업하는 것이 프로젝트에서 중력을 얻음에 따라 더 많은 것을 취할 수 있도록 가능한 경우 실제 성능 차이 값을 안내해 줄 수 있습니까?

답변:


7

것을 명심하시기 바랍니다 OPTIMIZE TABLE은 조각 모음을 수행하지 않습니다. 내부적으로 OPTIMIZE TABLE 은 여러 작업 (임시 파일로 데이터 복사, 인덱스 재 작성, 인덱스 통계 재 계산)을 수행합니다. 실제로, 내가 가지고있는 예는 표시된 것처럼 수동으로 수행 할 수 있습니다.

예 : 최적화하는 경우 mydb.mytable다음 명령을 입력하십시오.

OPTIMIZE TABLE mydb.mytable;

mysql은 다음과 같은 작업을 수행합니다.

CREATE TABLE mydb.mytable2 LIKE mydb.mytable;
ALTER TABLE mydb.mytable2 DISABLE KEYS;
INSERT INTO mydb.mytable2 SELECT * FROM mydb.mytable;
ALTER TABLE mydb.mytable2 ENABLE KEYS;
DROP TABLE mydb.mytable;
ALTER TABLE mydb.mytable2 RENAME mydb.mytable;
ANALYZE TABLE mydb.mytable;

이것은 많은 양의 UPDATE 및 DELETE가 발생하는 테이블에 매우 유용합니다.

이를 수행하면 두 가지를 달성 할 수 있습니다

  1. mysql이 올바른 크기의 조각으로 데이터를로드하려는 시도에서 테이블의 조각을 조사하지 못하게하십시오. 이러한 조각을 제거하면이 작업이 줄어 듭니다.

  2. 인덱스 통계를 다시 계산하면 MySQL Query Optimizer가 더 나은 EXPLAIN 계획을 구성하는 데 도움이됩니다. 그렇지 않으면, MySQL Query Optimizer가 EXPLAIN 계획에서 잘못된 추측을하기로 결정했기 때문에 실행 시간이 단축 될 수 있습니다. 이것은 대량의 UPDATE 및 DELETE가있는 테이블의 명확한 증상입니다.

경고

캐싱과 관련하여 캐싱은 전체 테이블 스캔을 수행하므로 빠르게 다이빙을 수행합니다. MyISAM 색인 페이지의 경우 MyISAM 키 캐시로 유입 및 유출됩니다. InnoDB의 경우 데이터 및 인덱스 페이지는 InnoDB 버퍼 풀로 들어오고 나옵니다.


답장을 보내 주셔서 감사합니다. 당신의 관점에서, 나는 더 나은 성능을 달성 할 수 있도록 자주 업데이트되는 테이블 중 하나에 대한 최적화 테이블을 예약하기 위해 cron 작업과 같은 일부 서비스를 더 잘 사용한다는 것을 이해합니다. 또한이 테이블에 InnoDB를 사용하고 있습니다. 이것이 더 나은 선택입니까? 또한 쿼리 성능을 향상시키기 위해 제안 된 SQL Server에서 HASH 조인을 찾았습니다.이 설명과 MySQL에서 이와 비슷한 것을 얻는 방법을 설명해 주시겠습니까? 또한 MySQL 용 SQL 쿼리 최적화 프로그램 [Windows7 버전]을 제공해주십시오.
사라 바난

@savaranan : 내가 언급 한 MySQL Query Optimizer는 MySQL에 내장 된 내부 쿼리였습니다. BTW 최적화하려는 테이블이 InnoDB이므로 DISABLE KEYS 및 ENABLE KEYS 단계를 건너 뛸 수 있습니다. 또한 InnoDB는 인덱스 다이브로 알려진 BTREE 인덱스의 페이지를 사용하여 근사치로 테이블 카디널리티를 다시 계산하므로 ANALYZE TABLE은 InnoDB 테이블에서 완전히 쓸모 없기 때문에 건너 뛸 수 있습니다.
RolandoMySQLDBA 2016 년

@savaranan : HASH 인덱스가있는 한, InnoDB에는 적응 형 해시 인덱스가 있습니다 ( dev.mysql.com/doc/refman/5.5/en/innodb-adaptive-hash.html ). 또한 "고성능 MySQL"( amazon.com/dp/0596101716 )의 103-106 페이지를 기반으로 해시 인덱스를 에뮬레이트하고 충돌을 처리하는 방법에 대한 좋은 제안이 있습니다.
RolandoMySQLDBA
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.