MyISAM 또는 InnoDB를 결정하기 전에 각각의 캐시 방식에 따라 두 스토리지 엔진을 모두 살펴 봐야합니다.
MyISAM
읽을 때 MyISAM 테이블의 인덱스는 .MYI 파일에서 한 번 읽고 MyISAM 키 캐시 ( key_buffer_size 크기로 )에 로드 할 수 있습니다 . MyISAM 테이블의 .MYD를 더 빨리 읽을 수있게하려면 어떻게해야합니까? 이것으로 :
ALTER TABLE mytable ROW_FORMAT=Fixed;
나는 내 과거 게시물에 이것에 대해 썼다
InnoDB
좋아, InnoDB는 어때? InnoDB는 쿼리를위한 디스크 I / O를 수행합니까? 놀랍게도 그렇습니다! 당신은 아마 그 말에 미쳤다고 생각하고 있지만 SELECT 쿼리조차도 사실 입니다. 이 시점에서 "InnoDB가 어떻게 쿼리를위한 디스크 I / O를 수행 하는가?"
모든 것은 ACID 호환 트랜잭션 스토리지 엔진 인 InnoDB로 되돌아갑니다 . InnoDB가 Transactional이 되려면 I
in 을 지원해야합니다 ACID
. 트랜잭션 격리를 유지하는 기술은 MVCC, Multiversion Concurrency Control을 통해 수행됩니다 . 간단히 말해서, InnoDB는 트랜잭션이 데이터를 변경하기 전에 어떤 데이터가 나타나는지 기록합니다. 그것은 어디에 기록됩니까? 시스템 테이블 스페이스 파일에서 ibdata1로 더 잘 알려져 있습니다. 이를 위해서는 디스크 I / O가 필요합니다 .
비교
InnoDB와 MyISAM은 모두 디스크 I / O를 수행하기 때문에 누가 어떤 요소를 더 빨리 지시합니까?
- 열 크기
- 열 형식
- 문자 세트
- 숫자 값의 범위 (충분히 큰 INT가 필요함)
- 블록에서 분할되는 행 (행 체인)
DELETEs
와 에 의해 발생하는 데이터 조각화UPDATEs
- 기본 키 크기 (InnoDB에 클러스터 된 인덱스가 있으며 두 개의 키 조회가 필요함)
- 색인 항목의 크기
- 목록은 계속됩니다 ...
발문
따라서 읽기 량이 많은 환경에서는 트랜잭션 동작을 지원하기 위해 ibdata1에 포함 된 실행 취소 로그에 기록 된 데이터가 충분한 경우 고정 행 형식의 MyISAM 테이블이 InnoDB 버퍼 풀에서 InnoDB 읽기를 능가 할 수 있습니다. InnoDB 데이터에 부과됩니다. 데이터 유형, 쿼리 및 스토리지 엔진을 실제로 신중하게 계획하십시오. 데이터가 커지면 데이터 이동이 매우 어려워 질 수 있습니다.
그건 그렇고, 나는 5 일 전에 다음과 같이 썼습니다 : mySQL에 메모리 제한을 어떻게 할당합니까?