조각화를 방지하고 일부 쿼리 실행을 최적화하기 위해 MySQL에서 인덱스를 유지 관리하는 방법에 대해 많은 연구를했습니다.
테이블에 사용 가능한 최대 공간과 데이터 및 인덱스에 사용되는 공간 간의 비율을 계산하는 수식에 익숙합니다.
그러나 내 주요 질문에 여전히 답이 없습니다. 아마도 이것은 SQL Server의 인덱스 유지 관리에 익숙하기 때문에 MySQL에서 다소 비슷해야한다고 생각하는 경향이 있습니다.
SQL Server에서 여러 인덱스를 가질 수 있으며 각 인덱스는 서로 다른 조각화 수준을 가질 수 있습니다. 그런 다음 나머지 하나에 영향을주지 않고 특정 인덱스에서 하나를 선택하여 'REORGANIZE'또는 'REBUILD'작업을 수행 할 수 있습니다.
내가 아는 한, '테이블 조각화'는 없으며 SQL Server는 '테이블 조각화'를 수정하는 도구를 제공하지 않습니다. 그것이 제공하는 것은 내부 및 외부 조각화뿐만 아니라 색인 조각화 (인덱스에 의해 사용 된 페이지 수 대 전체 및 연속성 간의 비율과 같은 것으로 이해 됨)를 검사하는 도구입니다.
그 모든 것은 적어도 저에게는 이해하기 매우 간단합니다.
이제 MySQL에서 인덱스를 유지 관리해야 할 때 위에서 언급 한 것처럼 '테이블 조각화'라는 개념 만 존재합니다.
MySQL의 테이블에는 여러 개의 인덱스가있을 수 있지만 유명한 수식으로 '조각화 비율'을 확인하면 각 인덱스의 조각화가 아니라 테이블 전체가 표시됩니다.
MySQL에서 인덱스를 최적화하려면 SQL Server에서와 같이 작동 할 특정 인덱스를 선택하지 않습니다. 대신 전체 테이블에서 'OPTIMIZE'작업을 수행하는데, 이는 아마도 모든 인덱스에 영향을 줄 것입니다.
테이블이 MySQL에서 최적화되면 데이터 + 인덱스에 사용 된 공간과 전체 공간의 비율이 줄어들어 하드 드라이브의 물리적 재구성이 물리적 공간이 줄어든다는 것을 의미합니다. 그러나 인덱스 조각화는 실제 공간뿐만 아니라 삽입 및 업데이트로 인해 시간이 지남에 따라 변경된 트리의 구조입니다.
마지막으로 InnoDB / MySQL에 테이블이 있습니다. 이 테이블에는 3 백만 개의 레코드, 105 개의 열 및 55 개의 인덱스가 있습니다. 인덱스는 2.1GB 인 1.5GB입니다.
이 테이블은 업데이트, 삽입 (실제로 레코드를 삭제하지는 않음)으로 인해 매일 수천 번 사용되었습니다.
이 테이블은 수년에 걸쳐 만들어졌으며 아무도 인덱스를 유지 관리하지 않는다는 것을 알고 있습니다.
나는 거기에서 거대한 조각화를 찾을 것으로 기대했지만 처방 된 조각화 계산을 수행 할 때
free_space / (data_length + index_length)
0.2 %의 조각화 만 있음이 밝혀졌습니다. IMHO는 매우 비현실적입니다.
따라서 큰 질문은 다음과 같습니다.
- 전체 테이블이 아닌 MySQL에서 특정 인덱스의 조각화를 확인하는 방법
- OPTIMIZE TABLE은 실제로 SQL Server에서와 같이 인덱스의 내부 / 외부 조각화를 수정합니까?
- MySQL에서 테이블을 최적화하면 실제로 테이블의 모든 인덱스를 다시 작성합니까?
- 트리 자체를 다시 만들지 않고 인덱스의 실제 공간을 줄이는 것이 실제로 더 나은 성능으로 해석된다고 생각하는 것이 현실적입니까?