다른 버전의 MySQL에서 테이블 구조 및 데이터 스토리지 요약

이 글에서는 MySQL 5.7과 8.0 버전의 Innodb 엔진과 MyISAM 엔진 하에서 데이터베이스 파일 저장 형태를 연구해 보고자 한다.

InnoDB 및 MyISAM과 같은 스토리지 엔진은 디스크에 테이블을 저장하고 디스크를 관리하기 위해 운영 체제에서 사용하는 구조를 파일 시스템이라고 합니다. 즉, InnoDB 및 MyISAM과 같은 스토리지 엔진은 파일 시스템에 테이블을 저장합니다. 우리가 데이터를 읽고 싶을 때 이 스토리지 엔진은 파일 시스템에서 데이터를 읽어 우리에게 돌려줍니다. 데이터를 쓰려고 할 때 이러한 스토리지 엔진은 데이터를 파일 시스템에 다시 씁니다.

【1】MySQL5.7

① InnoDB 엔진

아래 그림과 같이 조회할 데이터베이스를 무작위로 선택하면 파일 형식이 opt, frm 및 ibd의 세 가지임을 알 수 있습니다.

opt: 데이터베이스의 문자 집합 및 비교 규칙과 같은 데이터베이스의 다양한 속성을 포함합니다.

frm: 테이블의 구조를 저장하며 바이너리 형식 파일입니다.

테이블 구조는 테이블의 이름, 테이블에 있는 열 수, 데이터 유형, 각 열의 제약 조건 및 인덱스, 사용된 문자 집합 및 비교 규칙 및 기타 정보이며, 이 모든 것이 테이블 생성에 반영됩니다. 진술 .

ibd: 테이블의 데이터와 인덱스를 저장하는 독립 테이블 공간.

여기에 이미지 설명 삽입

MyISAM

아래와 같이 네 가지 파일 형식이 있습니다: opt, frm, MYD, MYI. InnoDB와의 차이점은 여기에는 ibd 파일이 없지만 MYD와 MYI로 나누어져 있다는 점을 알 수 있다.

MYD : 테이블 데이터 파일.

MYI : 테이블 인덱스 파일.

MYISAM은 인덱스와 데이터 파일을 별도로 저장하고 InnoDB는 인덱스 파일을 데이터 파일로 저장한다는 것도 여기에서 볼 수 있습니다.
여기에 이미지 설명 삽입

【2】MySQL8

① 이노디비

아래와 같이 ibd 파일만 있고 다른 것은 없습니다. 즉, 데이터베이스 정보, 테이블 구조, 테이블 데이터 및 테이블 인덱스가 모두 ibd 파일에 저장됩니다.

여기에 이미지 설명 삽입

마이삼

다음과 같이 MYIASM 테이블을 생성하고 데이터를 삽입하고 데이터 저장소 파일을 봅니다.

여기에 이미지 설명 삽입

sdi, MYD 및 MYI의 세 가지 파일이 있음을 알 수 있습니다. sdi는 앞에서 언급한 frm 파일과 동일하며 테이블 구조 정보도 저장합니다.

③ SDI에 대하여

MySQL8에서 우리는 파일이 없다는 것을 볼 수 있습니다 .frm. 그래서 어디로 갔습니까? sdi 파일에 넣어주시면 됩니다. Oracle 공식(MySQL8은 Oracle에 속함)은 frm 파일 정보 및 추가 정보를 직렬화된 사전 정보(Serialized Dictionary Information, SDI)로 옮기고 SDI는 InnoDB 아래의 ibd 파일 내부에 작성됩니다.

ibd 파일에서 SDI 정보를 추출하기 위해 오라클은 애플리케이션 ibd2sdi를 제공합니다. 이 도구는 다운로드할 필요가 없으며 MySQL8과 함께 제공되며 환경 변수가 구성되어 있으면 사용할 수 있습니다.

ibd 파일이 저장된 디렉토리로 이동하여 다음 명령을 실행할 수 있습니다.

ibd2sdi --dump-file=tb_sys_admin.txt tb_sys_admin.ibd

여기에 이미지 설명 삽입

[3] 테이블스페이스

InnoDB는 실제로 저장 공간을 관리하기 위한 기본 단위로 페이지를 사용하며 기본 페이지 크기는 16KB입니다. InnoDB 스토리지 엔진의 경우 각 인덱스는 B+ 트리에 해당하고 B+ 트리의 각 노드는 데이터 페이지이며 데이터 페이지 사이에 이중 연결 목록이 있기 때문에 데이터 페이지는 물리적으로 연속적일 필요가 없습니다. 이 페이지의 순서를 유지하십시오.

InnoDB의 클러스터 인덱스(즉, 기본 키 인덱스 파일)의 리프 노드는 완전한 사용자 레코드를 저장합니다.

이러한 페이지를 더 잘 관리하기 위해 InnoDB는 (테이블 공간 또는 파일 공간)이라는 表空间개념을 제안합니다 文件空间. 이 테이블 공간은 파일 시스템의 하나 이상의 실제 파일에 해당할 수 있는 추상적인 개념입니다(서로 다른 테이블 공간에 해당하는 파일의 수는 다를 수 있음). 각 테이블 공간은 여러 개로 나눌 수 있으며 테이블 데이터는 하나 表空间아래 에 저장됩니다 .

① 시스템 테이블스페이스

기본적으로 InnoDB는 데이터 디렉토리에 12M 크기의 ibdata1이라는 파일을 생성합니다. 이 파일은 파일 시스템의 해당 시스템 테이블 공간을 나타내는 것으로 자체 확장 파일이며 부족할 경우 크기가 증가합니다.

MySQL이 시작될 때 해당 파일 경로와 크기를 구성할 수 있습니다.예를 들어 my.cnf는 다음과 같이 구성됩니다.

[server]
innodb_data_file_path=data1:512M;data2:512M:autoextend

이렇게 512M 파일 2개는 MySQL 시작 후 시스템 테이블스페이스로 생성되며, autoextend는 이 2개 파일이 부족할 경우 data2 파일의 크기를 자동으로 확장해 준다는 뜻이다.

한 가지 주목해야 할 점은 MySQL 서버에는 시스템 테이블스페이스의 복사본이 하나만 있다는 것입니다. MySQL5.5.7에서 MySQL5.6.6까지의 각 버전에서 테이블의 데이터는 기본적으로 이 시스템 테이블스페이스에 저장됩니다.

② 독립적인 테이블 공간(테이블당 파일 공간)

MySQL5.6.6 이상 버전에서 InnoDB는 기본적으로 각 테이블의 데이터를 시스템 테이블스페이스에 저장하지 않고 각 테이블마다 독립적인 테이블스페이스를 생성한다. 많은 독립적인 테이블스페이스가 있습니다.

.ibd독립 테이블스페이스를 사용하여 테이블 데이터를 저장하는 경우 해당 테이블이 속한 데이터베이스에 해당하는 하위 디렉토리에 독립 테이블스페이스를 나타내는 파일이 생성되며, 파일명은 테이블명과 동일하나 확장자는 추가됩니다.

③ 시스템 테이블스페이스 및 독립 테이블스페이스 설정

데이터를 저장하기 위해 시스템 테이블스페이스를 사용할지 독립 테이블스페이스를 사용할지 지정할 수 있습니다. 이 기능은 innodb_file_per_table시작 매개변수에 의해 제어됩니다. 예를 들어 모든 테이블 데이터를 시스템 테이블스페이스에 의도적으로 저장하려는 경우 시작할 때 다음과 같이 구성할 수 있습니다. MySQL 서버:

[server]
innodb_file_per_table=0 # 0 : 使用系统表空间;1 : 使用独立表空间

기본값은 1이며 다음 명령을 사용하여 볼 수 있습니다.

show variables  like '%innodb_file_per_table%'

이 매개변수의 수정은 새로 작성된 테이블에 적용되지만 테이블스페이스가 할당된 테이블에는 적용되지 않습니다. 시스템 테이블스페이스에 이미 존재하는 테이블을 독립된 테이블스페이스로 이전하려면 다음 구문을 사용할 수 있습니다.

alter table 表名 tablespace [=] innodb_file_per_table;

또는 독립 테이블스페이스에 이미 존재하는 테이블을 시스템 테이블스페이스로 전송하려면 다음 구문을 사용할 수 있습니다.

alter table 表名 tablespace [=] innodb_system;

④ 기타 유형의 테이블스페이스

MySQL의 개발로 위의 두 가지 기존 테이블스페이스 외에도 일반 테이블스페이스(일반 테이블스페이스), 임시 테이블스페이스(임시 테이블스페이스) 등과 같은 몇 가지 다른 유형의 테이블스페이스가 제안되었습니다.

추천

출처blog.csdn.net/J080624/article/details/72866822/