15.2.3.2 Dynamic 테이블의 특징
MyISAM
테이블이 가변 길이 컬럼을 포함하는 경우 ( VARCHAR
, VARBINARY
, BLOB
또는 TEXT
) 또는 테이블이 ROW_FORMAT=DYNAMIC
테이블 옵션으로 생성 된 경우, 동적 스토리지 포맷이 사용됩니다.
동적 포맷은 각 행에 행의 길이를 나타내는 헤더가 있기 때문에 정적 형식보다 조금 복잡합니다. 업데이트의 결과로 줄이 길어진 경우 행이 분할 될 수 있습니다 (비 연속적인 조각으로 저장됩니다).
OPTIMIZE TABLE
또는 myisamchk -r을 사용하여 테이블을 조각 모음 할 수 있습니다. 가변 길이 컬럼이 포함 된 테이블에서 고정 길이 컬럼에 자주 액세스하거나 변경할 경우 가변 길이 컬럼을 다른 테이블로 이동하여 단편화를 방지하는 방법이 좋은 경우가 있습니다.
동적 형식의 테이블에는 다음과 같은 특징이 있습니다.
길이가 4 미만의 컬럼을 제외한 모든 문자열 컬럼은 동적입니다.
각 행의 시작은 어느 컬럼이 빈 문자열 (문자열 컬럼의 경우) 또는 0 (숫자 컬럼의 경우)를 포함 여부를 나타내는 비트 맵이 붙어 있습니다. 여기에는
NULL
값을 포함한 컬럼이 포함되어 있지 않습니다. 후행 공백을 제거한 후 문자열 컬럼의 길이가 제로이거나 숫자 컬럼의 값이 제로이거나하면 비트 맵에서 표시가 있지만 디스크에 저장되지 않습니다. 비어 있지 않은 문자열은 길이 바이트 문자열 내용을 추가하고 저장됩니다.보통 고정 길이 테이블과 비교하면 필요한 디스크 공간이 훨씬 적습니다.
각 행은 필요한 용량 만 사용합니다. 그러나 행이 더 커지면 필요한 몇 조각으로 분할 된 행의 단편화가 발생하게됩니다. 예를 들어, 행의 길이를 연장하는 정보를 사용하여 행을 업데이트하면 줄은 단편화됩니다. 이러한 경우 성능을 높이기 위해 가끔
OPTIMIZE TABLE
또는 myisamchk -r을 실행해야 안 될지도 모릅니다. myisamchk -ei를 사용하여 테이블의 통계를 가져옵니다.행이 여러 조각으로 분할되어 있거나 링크 (단편)가 없어지고있는 경우가 있기 때문에 충돌 후 다시 정적 형식 테이블보다 어렵습니다.
동적 크기의 행의 예상 유키나가는 다음과 같이 계산됩니다.
3 + (
number of columns
+ 7) / 8 + (number of char columns
) + (packed size of numeric columns
) + (length of strings
) + (number of NULL columns
+ 7) / 8각각의 링크는 6 바이트의 페널티가 있습니다. 업데이트에 의해 행이 확대되는 경우에는 반드시 동적 라인이 연결됩니다. 새로운 링크는 각각 최소 20 바이트이므로 아마도 다음의 확장은 같은 링크입니다. 그렇지 않은 경우 다른 링크가 생성됩니다. myisamchk -ed를 이용하여 링크 수를 확인할 수 있습니다.
OPTIMIZE TABLE
또는 myisamchk -r을 사용하면 모든 링크를 삭제할 수 있습니다.