>

문서를 보았지만 관계에 대한 명확한 대답이 없었습니다. 누군가 MySQL에서 관계의 실제 예를 들어 줄 수 있습니까?

데이터베이스 페이지는 데이터베이스에서 가장 작은 읽기/쓰기 단위이며 일반적으로 8KB이지만

  • MySQL 페이지와 .frm&.ibd 파일의 관계는 무엇입니까?
  • .frm 파일이 여러 페이지로 구성되어 있습니까?
  • 그렇다면 .frm 파일은 그 안에있는 페이지에 어떤 유형의 정보를 가지고 있습니까?
  • 각 페이지의 위치와 같은 것들?
  • 어떻게 더 읽을 수 있나요?
  • 테이블 스페이스는 어떻습니까?
  • .frm 파일은 모두 테이블 스페이스입니까?

몇 시간 동안 설명서를 읽었지만 더 혼란 스러웠습니다

(InoDB 스토리지 엔진 BTW에 대해 이야기하고 있습니다)

  • 답변 # 1

    (@ jynus에는 좋은 답변이 있습니다. 잘하면 반복하지 않고 동의하지 않는 그의 답변에 추가하고 싶습니다.)

    혼란의 일부는InnoDB의 진화에서 비롯됩니다.

    MySQL 사용자의 90 % 이상이 "테이블 스페이스"를 완전히 무시할 수 있다는 것을 명심하십시오. 그것들을 이해하는 것은 학문적 연습이거나 디스크 관리에 중요한 경우입니다.

    처음에는 32 비트 시스템에서 ibdata1 라는 하나의 테이블 스페이스가있었습니다. . 그러나 크기가 충분하지 않은 경우 (일부 컴퓨터는파일에 대해 2GB의 제한이 있음을 기억하십시오) ibdata2 가있었습니다. 기술적으로, 이것은 "테이블 스페이스"의 세트 였지만, 그렇게 선전되지는 않았습니다.

    어쨌든 ibdata1 의 개념  InnoDB에 대한 주요 장소가 계속 존재하기 때문입니다.

    처음에는 모든 테이블과 인덱스의 모든 블록이 ibdata1에있었습니다. 문제는 여전히 여유 공간이 ibdata1에서 빈 블록으로 남겨져 OS에 다시 제공 될 수 없다는 것입니다.

    테이블을 다른 디스크에 놓고 DROP 를 허용하려면  또는 ALTER  테이블과 운영 체제 innodb_file_per_table 에 공간을 다시 제공 . 따라서이 시점에서 ibdata1에는 기타 항목과 함께 일부 테이블이 포함되었습니다. 다양한 Wyzwyz  각각 하나의 테이블 (인덱스 포함) 또는 하나의 .ibd 를 포함  테이블의.

    PARTITION  테이블을 '서브 테이블'로 분리 할 수 ​​있으며 각 테이블은 거의 테이블처럼 작동합니다.

    이것은 여전히 ​​좋은 디스크 관리를 허용하지 않습니다. file_per_table로 저장된 수천 개의 작은 테이블은 많은 디스크 공간을 낭비합니다. 다른 데이터베이스를 다른 파일 시스템에 두는 것은 번거 롭습니다. 그래서 더 일반적인 "테이블 스페이스"가 등장합니다.

    동시에, "tmp"와 "undo"공간의 처리가 중요해졌습니다. 과거에는 ibdata1에서 약간 모 놀리 식으로 처리되었습니다. 그러나 뮤텍스 속도 저하 등이 발생하여 확산되었습니다.

    5.7 이상에서 "tablespaces"로 무엇을해야합니까?

    계획 A : 무시하십시오. 기본값은 충분할 것입니다.

    계획 B : 데이터베이스 당 하나의 테이블 스페이스. 불행히도이 작업을 수행하는 '자동'방법은 없습니다.

    계획 C : 80-20 규칙을 따르십시오. 디스크 공간의 80 %를 소비 할 테이블의 20 %에는 file_per_table을 사용하십시오. 나머지는 ibdata1 (또는 데이터베이스 별 테이블 스페이스)로 이동하십시오.

    메타 정보의 역사는 더 간단합니다 :

    8.0 이전 : PARTITIONing  파일에데이터 없음스키마가 포함되었습니다. ibdata1에 더 많은 정보가 포함되어 있습니다.

    8.0+ : 새로운 "데이터 사전"은 InnoDB 테이블에 있습니다. (부트 스트랩은 무섭습니다.) 스키마와 다른 많은 것들이 포함되어 있습니다. DD에 문제가 생길 가능성이 거의없는 경우 디스크에 파일이 있으며 스키마를 재구성해야합니다.

    블록 :

    각 테이블 스페이스 (ibdata *, .ibd)는 항상 블록으로 분리되었습니다. 처음에는 16KB 중 하나가 선택되었습니다. 1MB (?) 또는 8MB (?)의 "extents"에 대해들을 수 있습니다. 이는 단지 여러 블록을 사전 할당하는 것입니다. HDD에는 약간 도움이되었지만 SSD에는 쓸모가 없습니다.

    4/8/16/32/64KB InnoDB 블록을 사용할 수 있지만 99 % 이상의 사용자가 기본 16KB를 사용합니다. 이들은 일부 인덱스 (데이터의 경우 기본 키 또는 보조 인덱스의 보조 키)를 기반으로 B + 트리로 구성됩니다. 편리한 Thumb of Thumb : 100 개의 항목이 BTree 블록에 저장됩니다. 상관 관계 : 백만 행 테이블 (또는 인덱스)의 깊이는 약 3 단계입니다.

  • 답변 # 2

    .frm

    .frm은 테이블에 대한 메타 데이터를 포함하는 데 사용됩니다. 즉, 구조 (

      What is the relation between MySQL pages and .frm & .ibd files? Is .frm files consists of many pages coming together?

    의 출력을 생각합니다) -열 및 데이터 형식)을 자체 형식으로 이제는 트랜잭션 스키마 변경을 허용하기 위해 mysql 데이터베이스의 InnoDB 테이블에 데이터가 저장되는 날 (MySQL 8.0부터)이 있습니다. .ibd에는 대부분의 데이터가 포함되어 있습니다 (innodb에는 자체 내부 데이터 사전이있어서 MySQL을 지원하지만 다른 것은 아닙니다), 네임 스페이스>extents>페이지 및 페이지 내부에서 "행"을 기록 합니다.

    InnoDB와 관련된 다른 것들 (구조)이 작동하지만 주요 단점은 연결 처리, 쿼리 구문 분석 및 실행 최적화를 처리하는 SQL 계층이라는 두 가지 평면이 있다는 것입니다. 데이터가 실제로 저장되는 방법을 결정하는 엔진 계층 (InnoDB, MyISAM, MyRocks 등) 두 계층 모두 처리기 API 라는 일반 API와 통신합니다. 여기에는 "기본 키 순서로 첫 번째 레코드 검색"또는 "다음 레코드 얻기"와 같은 매우 기본적인 행 수준 작업이 포함됩니다.

    .frms는 SQL 수준의 기능 (모든 엔진에서 찾아 볼 수 있음)이고 .ibds는 InnoDB 전용 구조였습니다. InnoDB에는 MySQL 사전과는 별도로 자체 내부 사전이 있기 때문에 파일 시스템에서 .frm을 잘못 삭제하면 테이블이 여전히 관점에서 볼 때 InnoDB가 혼란스러워졌습니다.

    와이즈 비즈

    아니요, MySQL 데이터 딕셔너리는 .frm에 있거나 새로운 형식으로되어 있으면 기본 SQL 수준 정보 (테이블 정의, 열, 유형 등) 만 포함합니다. InnoDB 정보는 InnoDB 관련 파일 (ibdata1, .ibds, 트랜잭션 로그)에 저장됩니다. InnoDB 엔진이 Handler API를 통해 특정 행을 읽어야 할 필요성을 수신하면 SQL 이후의 데이터와 독립적으로 캐시에있을 수 있습니다 (버퍼 풀 또는 디스크에만 있거나 디스크에 있지만 디스크에있을 수 있음) 주어진 세션에 대해 숨겨져 있으므로 사용할 수 없습니다). 특정 페이지를 찾기 위해 일련의 메모리 및 디스크 구조 (파일의 헤더, 트리와 같은 구조, 조회 테이블, InnoDB가 올바른 페이지에 액세스하도록하는 해시)를 구현합니다. 이것은 InnoDB 내부에 대한 적절한 개요를 제공 할 공간이 거의 없지만 디스크와 액세스 제어에 대한 일관성을 유지하면서 데이터에 빠르게 액세스 할 수있는 매우 복잡한 포인터 및 참조 세트라고 생각합니다.

    와이즈 비즈

    이미 귀하와 InnoDB : 핵심으로의 여행 : 작동 방식에 대해 자세히 설명합니다. 그 외에도, 가장 좋은 방법은 소스 코드 자체입니다. MySQL 소스 코드를 사용할 수 있으며 InnoDB가 자체 데이터 구조를 구현하는 방법에 대한 세부 정보를 확인할 수 있습니다. 이것은 간단하지 않으며 여기에 요약하기가 거의 불가능합니다. 매우 간단한 접근 방식을 위해 각 테이블은 기본 키 순서대로 16K 페이지로 구성된 B + 트리 구조를 만듭니다 (명시 적으로 생성되지 않은 경우에도 항상 기본 키가 있음). 다른 인덱스는 인덱스하는 행의 PK 값을 기록하는 별도의 트리 구조로 구현됩니다. 기술적 세부 사항없이 논리적 관점에 대한 단순화 된 접근법을 원한다면 내 MySQL/InnoDB를위한 쿼리 최적화 슬라이드 .

    와이즈 비즈

    아니요. 우리가 말했듯이 .frm은 MySQL 테이블 구조입니다. 그러나 InnoDB는 일반적으로 테이블 당 다른 테이블 스페이스를 생성하며 (파티션 테이블과 같은 예외가 있음) 각 테이블 스페이스는 일반적으로 별도의 파일 (.ibd)에 있습니다. 그러나 이것은 사실이 아닙니다. tablespace0에 여러 개의 테이블이있을 수 있습니다 (복잡한 :-)).

    SHOW CREATE TABLE

관련 자료

  • 이전 oracle - 다음 시나리오에서 커서를 바꾸는 다른 방법이 있습니까?
  • 다음 query - 이 행과 관련된 속성을 가진 다른 행을 계산하는 MySQL 계산 열