programing

OPTIMISE TABLE을 실행하여 테이블 조각 모음으로 퍼포먼스 향상

goodjava 2023. 2. 3. 20:10

OPTIMISE TABLE을 실행하여 테이블 조각 모음으로 퍼포먼스 향상

OPTIMISE TABLE 관련 기사를 읽었는데, 자세한 설명이 필요합니다.

MariaDBv10.6.7에 대해 mysqltuner.pl을 실행했는데, 몇 가지 권장 사항이 있었는데 그 중 하나가 최적화 테이블을 실행하는 것이었습니다.

Run OPTIMIZE TABLE to defragment tables for better performance
      OPTIMIZE TABLE `DB`.`TableA`; -- can free 426 MB
    Total freed space after theses OPTIMIZE TABLE : 426 Mb

질문:

  1. 성능을 향상시키기 위해 InnoDB 테이블에서 OPTIME TABLE 'TableA'를 실행해도 될까요? (디스크에서 사용되지 않는 공간을 제거하지만 성능에 도움이 될까요?)
  2. InnoDB를 사용하고 있기 때문에, 「테이블은 최적화를 서포트하고 있지 않고, 대신에 Refreate+Analyze를 하고 있다」라고 되어 있습니다.Alter Table을 실행해야 합니까?OPTIMISE TABLE이 아닌 OPTIMIZE(양쪽 모두 링크되어 있는 것 같습니까?
  3. Optimize TABLE을 권장대로 실행해도 테이블 426Mb가 완전히 해방되지 않습니다(384MB로 감소).전체 사이즈를 풀 수는 없나요?
> select * from information_schema.TABLES where TABLE_NAME = "TableA"\G;
*************************** 1. row ***************************
  TABLE_CATALOG: def
   TABLE_SCHEMA: DB
     TABLE_NAME: TableA
     TABLE_TYPE: BASE TABLE
         ENGINE: InnoDB
        VERSION: 10
     ROW_FORMAT: Dynamic
     TABLE_ROWS: 1600474
 AVG_ROW_LENGTH: 207
    DATA_LENGTH: 332136448
MAX_DATA_LENGTH: 0
   INDEX_LENGTH: 0
      DATA_FREE: 446693376 (426MB)
 AUTO_INCREMENT: NULL
    CREATE_TIME: 2022-08-09 16:01:05
    UPDATE_TIME: 2022-08-09 16:04:47
     CHECK_TIME: NULL
TABLE_COLLATION: utf8_general_ci
       CHECKSUM: NULL
 CREATE_OPTIONS: partitioned
  TABLE_COMMENT:
1 row in set (0.01 sec)

ERROR: No query specified


> optimize table TableA;
+-----------+----------+----------+--------------------------------------------------------------------+
| Table     | Op       | Msg_type | Msg_text                                                           |
+-----------+----------+----------+--------------------------------------------------------------------+
| DB.TableA | optimize | note     | Table does not support optimize, doing recreate + analyze instead  |
| DB.TableA | optimize | status   | OK                                                                 |
+-----------+----------+----------+--------------------------------------------------------------------+
2 rows in set (8.25 sec)

127.0.0.1:3307> select * from information_schema.TABLES where TABLE_NAME = "TableA"\G;
*************************** 1. row ***************************
  TABLE_CATALOG: def
   TABLE_SCHEMA: DB
     TABLE_NAME: TableA
     TABLE_TYPE: BASE TABLE
         ENGINE: InnoDB
        VERSION: 10
     ROW_FORMAT: Dynamic
     TABLE_ROWS: 1600474
 AVG_ROW_LENGTH: 193
    DATA_LENGTH: 310116352
MAX_DATA_LENGTH: 0
   INDEX_LENGTH: 0
      DATA_FREE: 402653184 (384MB)
 AUTO_INCREMENT: NULL
    CREATE_TIME: 2022-08-09 16:47:00
    UPDATE_TIME: NULL
     CHECK_TIME: NULL
TABLE_COLLATION: utf8_general_ci
       CHECKSUM: NULL
 CREATE_OPTIONS: partitioned
  TABLE_COMMENT:
1 row in set (0.27 sec)

mysqltuner.pl과 같은 논리를 사용하여 빈 크기를 검색.쿼리 뒤에 있는 논리에 대해 확실하지 않습니다.

SELECT CONCAT(CONCAT(TABLE_SCHEMA, '.'), TABLE_NAME),cast(DATA_FREE as signed) FROM information_schema.TABLES WHERE TABLE_SCHEMA NOT IN ('information_schema','performance_schema', 'mysql') AND DATA_LENGTH/1024/1024>100 AND cast(DATA_FREE as signed)*100/(DATA_LENGTH+INDEX_LENGTH+cast(DATA_FREE as signed)) > 10 AND NOT ENGINE='MEMORY' $not_innodb

"Never합니다.OPTIMIZE TABLE을 사용법)))))))))))))))))) 。

왜비비 절감 ?? ??? ★★PARTITION4MB~7MB입니다.조언자가 그것을 알아차리지 못했기 때문에 당신은 저축을 받지 못했다.

할 때.DELETE말싸움도 많이 하고 얘기하자., 은 그렇게 하고 OPTIMIZE.

70달러?160달러?어떤 이점이 있습니까?PARTITIONing하지 않고 더하겠습니다.메인 쿼리를 표시해 주세요.분할하지 않고 더 나은 인덱스로 이동하겠습니다.

질문의 정보를 통해 모든 것이 데이터베이스에 잘 보관되어 있습니다.

  1. 네, OPTIMIZE를 프로덕션 테이블에서 사용해도 됩니다.그리고 InnoDB 시대의 대체 기종은 온라인 데이터 정의 언어 문장을 사용합니다.

  2. InnoDB 테이블용으로 OPTIME TABLE을 선택하면 서버는 올바른 작업을 수행합니다.

  3. sqltuner.pl과 같은 튜닝 툴은 공간 절약 등의 견적을 제공합니다.

  4. 대부분의 경우 OPTIMISE TABLE로 인한 성능 향상을 측정하기는 어렵습니다.FULLTEXT 인덱스가 있는 사용 중인 테이블은 예외입니다.

배경도 있고

응용 프로그램이 테이블을 변경할 때(INSERT, UPDATE 및 DELETE 사용) 테이블의 데이터 구조에 사용되지 않는 공간이 남아 있을 수 있습니다.명백한 경우: 행을 업데이트하여 더 긴 VARCHAR() 값을 더 짧은 값으로 변경합니다.

또한 FULLTEXT 색인은 변경 시 공백으로 남습니다.

진단 프로그램 information_discloss.TABLES.DATA_FREE, 테이블을 재구성(최적화)한 후 사용할 수 있는 공간을 예측합니다.이러한 추정치는 InnoDB와 같은 최신 스토리지 엔진보다 기존 MyISAM 스토리지 엔진에 더 정확합니다.따라서 테이블 리오르가 툴이 예상한 만큼의 빈 공간을 확보하지 못한 것은 놀라운 일이 아닙니다.

참고 자료:

OPTIMISE TABLE을 사용하면 InnoDB 테이블 조각 모음이 수행되므로 특히 대량 삭제와 같은 주요 데이터 변경 직후 크기가 줄어들 수 있습니다.

그러나 실제로는 성능이 크게 향상되지는 않습니다.Optimize TABLE을 사용하는 이유는 성능 때문이 아닙니다.

"Table does not support optimize(테이블이 최적화를 지원하지 않습니다)"라는 오류 메시지는 OPTIMIZE TABLE이 이전 MyISAM 스토리지 엔진에서 수행하는 것과 정확히 동일한 작업을 수행하지 않기 때문입니다.InnoDB의 경우 이 문을 지원하며 행을 새 테이블스페이스에 복사하고 프로세스에서 보조 인덱스를 재구축하는 등 유용한 작업을 수행합니다.최적화를 지원하지 않는다는 메시지는 오해의 소지가 있습니다.

InnoDB의 경우OPTIMIZE TABLE <name>.ALTER TABLE <name> FORCE ★★★★★★★★★★★★★★★★★」ALTER TABLE <name> ENGINE=InnoDB의.ALTER TABLE <name> OPTIMIZE(일본어판/영어:

이상하리만치 높은 "data_free"는 공유 시스템 테이블스페이스에 이 테이블을 저장하고 있는지 궁금합니다.즉, 설정 옵션innodb_file_per_table디세이블입니다., 은 「」테이블 됩니다.이 스페이스는, 「 스페이스에 격납됩니다.이치노ibdata1데이터 디렉토리에 있습니다.

테이블이 시스템 테이블스페이스에 있는 경우 OPTIMISE TABLE은 테이블을 새 테이블스페이스에 복사하지 않고 데이터를 시스템 테이블스페이스의 다른 영역으로 이동시킬 뿐 빈 공간을 복구하지 않습니다.또한 "data_free"는 각 테이블뿐만 아니라 테이블스페이스 전체에 대해 보고된다."data_free"는 해당 테이블스페이스에서 테이블을 최적화한 후에도 크게 변경되지 않을 수 있습니다.

테이블이 차지하는 테이블스페이스는 다음과 같이 확인할 수 있습니다.

SELECT SPACE FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES
WHERE NAME = '<schemaname>.<tablename>';

시스템 테이블스페이스의 공간 ID는 0입니다.0이 아닌 경우 테이블은 자체 개별 테이블스페이스에 있습니다.


사람들이 mysqltuner를 사용하지 않았으면 좋겠다.

mysqltuner는 신뢰할 수 없는 조언을 제공하는 것으로 알려져 있습니다.저자가 MySQL의 내부 정보를 충분히 알지 못해 조언을 할 수 없는 경우를 본 적이 있습니다.나는 mysqltuner가 많은 불필요한 작업의 원인이라고 생각한다.

다음은 mysqltuner 보고서로 혼란스러워하는 사람들의 오해를 바로잡기 위해 노력했던 몇 가지 예입니다.

언급URL : https://stackoverflow.com/questions/73291076/run-optimize-table-to-defragment-tables-for-better-performance