>

그래서 mysql에서 데이터베이스 페이지와 DBMS에 대해 읽었고 정말 혼란스러워했습니다.

문서 데이터베이스를 기반으로 페이지는 데이터베이스의 튜플이있는 페이지의 행을 가리키는 부분을 가지고 있지만 mytable에서 SELECT name과 같은 것을 입력 할 때 DBMS는 어떻게 올바른 페이지를 찾는가? 1? 이 정보는 없습니다

DBMS가 해당 .frm을 찾는다고 가정하지만 그 안에 읽어야하는 올바른 페이지를 어떻게 찾습니까?

이 기사를 읽었습니다. https://ieeexplore.ieee.org/document/5474822/

.frm 파일의 헤더 내용을 보여 주었지만 헤더에 올바른 페이지를 찾는 데 도움이되는 내용이 없다면 DBMS는 어떻게 찾을 수 있습니까?!

  • 답변 # 1

    와이즈 비즈  파일에는 스키마 만 포함됩니다. 파일을 열 때 확인한 다음 정보가 RAM에 유지됩니다.

    .frm  또는 ibdata1  파일은 데이터의 "테이블 스페이스"입니다. 여기에는 데이터, 인덱스 등에 대한 메타 정보가 포함됩니다. 특히, 테이블 인덱스의 루트 노드를 가리 킵니다. (참고 : 데이터는 .ibd 를 기준으로 저장됩니다. "data"는 "index"와 매우 유사합니다.)

    B + Tree의 "루트"노드에서 개별 행으로 드릴 다운 할 수 있습니다.

    개별 행에서 (범위/인덱스/테이블 스캔을 수행 할 때) B + 트리에서 다음/이전 행을 쉽게 찾을 수 있습니다.

    BTrees는 16KB "블록"으로 구성되며 테이블 스페이스 번호와 블록 번호 (대략)가 포함 된 튜플이 가리 킵니다. 테이블 스페이스는 파일이므로 블록 번호는 해당 파일에서 바이트 오프셋으로 쉽게 변환됩니다. OS에는 물리적 주소를 찾기 위해 이러한 논리적 주소를 찾는 추가 계층이 있습니다.

    블록 내에는 데이터 행 또는 인덱스 행이거나 BTree를 다른 블록 ( "노드")으로 링크하는 100 개의 "레코드"가있을 수 있습니다. ( '100'은 엄지 손가락의 법칙입니다. 실제로는 1에서 수천까지 가능합니다.)

    블록 내에서 특정 행 ( "다음"또는 "이전"이외)을 찾으려면 검색 형식이 수행됩니다. (이것이 선형 스캔인지 바이너리 검색인지 모르겠습니다.)

    PRIMARY KEY
    
    

    <올>

    명령을 구문 분석하십시오.

    테이블을 "열기"-캐시 됨 (cf SELECT name from mytable where id>1 ) 또는 table_open_cache 사용  (또는 MySQL 8.0의 데이터 사전)

    쿼리 수행 방법 파악

    .frm 에서 색인 찾기 . 그것이 id 라고 가정 해 봅시다

    PK의 B + Tree 루트 찾기

    PRIMARY KEY(id) 를 사용하여 마지막 행 (또는 PK가 고유하기 때문에 유일한 행)을 찾을 때까지 드릴 다운하십시오. 그런 다음 '다음'레코드에서 시작하십시오.

    스캔 포워드 id=1 가져 오기  각 행에서 테이블 끝에 도달 할 때까지

    name

  • 이전 mysql - 여러 개의 LEFT JOIN 후에 NULL이 아닌 행을 어떻게 필터링합니까?
  • 다음 postgresql - CHECK 제약 조건을 추가해도 postgres 테이블에서 ATTACH PARTITION의 성능이 향상되지 않습니다