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.