해결된 질문
작성
·
247
0
안녕하세요,
TEXT 타입 데이터가 저장되는 위치에 대해 궁금한 점이 있습니다.
The internal representation of a MySQL table has a maximum row size limit of 65,535 bytes, even if the storage engine is capable of supporting larger rows. BLOB
and TEXT
columns only contribute 9 to 12 bytes toward the row size limit because their contents are stored separately from the rest of the row.
https://dev.mysql.com/doc/refman/8.4/en/column-count-limit.html#row-size-limits
TEXT 컬럼은 레코드가 저장될 때 외부에 저장된 뒤, 해당 위치를 가리키는 포인터 (?) 가 저장되는 것으로 이해가 되는데요.
Q. 여기서 말하는 다른 row의 컬럼과 별도로 저장된다는 것이 Off-Page와는 별개의 개념인가요? 연속적으로 저장되는 것이 아닐 뿐 같은 페이지에 저장을 하게 되나요?
항상 감사합니다.
답변 2
0
안녕하세요. TEXT 타입은 항상 오프페이지로 저장되는 것은 아닙니다.
하나의 레코드 사이즈가 데이터페이지의 절반 크기보다 작은 경우 가변길이 컬럼의 값은 기존 다른 컬럼들과 함께 동일한 데이터페이지에 저장됩니다.
일반적으로 MySQL에서 데이터페이지는 16KB로 설정돼있는데, 이 경우 대략 하나의 레코드 사이즈가 8KB 보다 크게되면 레코드 사이즈가 페이지의 절반보다 작아질 때까지 레코드에서 가변길이 컬럼들에 대해 큰 값부터 하나씩 외부 페이지로 데이터를 옮깁니다.
그리고 레코드의 저장 형식(InnoDB Row Format)에 따라 Off-Page로 저장 시 본래의 데이터 페이지에 얼만큼의 데이터를 남겨둘건지, 어느정도 크기 이내면 레코드 사이즈가 크더라도 Off-Page로 저장되지 않는지 등의 내용이 달라집니다.
MySQL 최신 버전에서 InnoDB 테이블의 기본 레코드 저장 형식은 DYNAMIC
인데요. 이 형식에서는 40Bytes 이하인 가변길이 컬럼 값은 Off-Page로 저장되지 않으며, 레코드 사이즈가 커서 Off-Page 형태로 가변길이 컬럼 값을 저장하는 경우 본래의 데이터페이지에는 외부 페이지를 가리키는 20Byte의 포인터 값만 저장됩니다.
이와 관련해서는 아래 공식 문서 내용을 참고하시면 좋을 것 같습니다.
https://dev.mysql.com/doc/refman/8.4/en/innodb-row-format.html
내용이 이해하시기에 조금 어려울 수 있는데, 추가로 궁금한 부분 있으시면 편하게 다시 문의주세요.
0
안녕하세요, 인프런 AI 인턴입니다.
chanho0912님, MySQL에서 TEXT
와 BLOB
타입 데이터의 저장 위치에 대해 궁금하신 점에 대한 답변드립니다.
TEXT
와 BLOB
데이터 타입은 큰 용량의 데이터를 저장하기 위한 타입으로, 이들 데이터는 실제 테이블의 레코드와 별도로 저장되며, 레코드 내에는 해당 데이터가 저장된 위치를 가리키는 포인터가 저장됩니다.
여기서의 “별도로 저장된다”는 의미는 데이터가 레코드의 나머지 부분과 같은 물리적 위치에 직접 저장되지 않고, 별도의 공간에 저장되어 그 위치를 가리키는 포인터만 레코드에 포함된다는 것을 의미합니다. 이처럼 별도로 저장되는 방식을 Off-Page 저장이라고도 합니다. 여기서 Off-Page라는 표현은 데이터가 레코드가 위치한 페이지 이외의 다른 페이지에 저장된다는 의미로, 반대로 In-Page라면 해당 컬럼의 데이터가 레코드와 같은 페이지 내에 저장됩니다. 따라서, TEXT
타입 데이터가 Off-Page인지 여부는 그것이 테이블의 다른 컬럼 데이터와 별개의 저장 공간(즉, 별도의 페이지)에 저장된다는 것을 의미하며, 큰 용량의 데이터 핸들링을 위해 설계된 방식입니다.
항상 감사드리며, 더 궁금한 사항이 있으시면 언제든지 문의해 주세요.
아 넵넵 답변 감사합니다.
그렇다면, TEXT 타입 값은 레코드 size가 작아도 다른 데이터 페이지에 저장되는 것이 맞나요?