MySQL에 관해서는, 가장 잘 알려지고 널리 사용되는 MySQL 스토리지 엔진인 MyISAM과 InnoDB를 이해하기 어려울 것입니다. 오늘은 MySQL에서 MyISAM과 InnoDB의 차이점에 대해 이야기해 보겠습니다...
MyISAM이란 무엇인가요?
MyISAM은 MySQL 관계형 데이터베이스 관리 시스템(5.5 이전)의 기본 스토리지 엔진입니다.。 이 MySQL 테이블 저장 구조는 이전 ISAM 코드에서 많은 유용한 기능을 확장했습니다. 새로운 버전의 MySQL에서는 InnoDB 엔진이 트랜잭션, 참조 무결성, 그리고 더 높은 동시성 측면에서 MyISAM을 대체하고 있습니다. 각 MyISAM 테이블은 하드 디스크의 세 개의 파일에 해당합니다. 세 파일 모두 같은 파일 이름을 가지지만, 타입 목적을 나타내기 위해 확장자가 다릅니다: .frm 파일은 테이블의 정의를 담고 있지만, 이 파일은 MyISAM 엔진의 일부가 아니라 서버의 일부입니다; .MYD는 테이블의 데이터를 저장하고; .MYI는 테이블의 인덱스 파일입니다.
InnoDB란 무엇인가요?
InnoDB는 MySQL용 또 다른 스토리지 엔진이며, MySQL AB가 발표한 새로운 표준은 모든 바이너리 설치 패키지에 포함되어 있습니다.5.5부터 기본 저장 엔진으로。 다른 스토리지 엔진에 비해 장점은 ACID 호환 트랜잭션(PostgreSQL과 유사)과 매개변수 무결성(즉, 외래키 지원)을 지원한다는 점입니다.
오라클 코퍼레이션은 2005년 10월 이노베이스를 인수했습니다. Innobase는 이중 인증 승인을 사용합니다. GNU를 사용해 배포되며, InnoDB를 상업용 소프트웨어에 통합하려는 다른 그룹이 라이선스를 받을 수 있도록 허용합니다.
가장 인기 있는 스토리지 엔진은 MyISAM과 InnoDB입니다. MyISAM과 InnoDB의 주요 차이점은 성능과 트랜잭션 제어입니다. MyISAM은 초기 ISAM(인덱스 순차 접근 방법, MySQL 5.0 이후 ISAM은 더 이상 지원되지 않음)의 확장 구현체입니다. ISAM은 읽기 빈도가 쓰기 빈도보다 훨씬 높은 상황을 처리하도록 설계되어 있습니다. 따라서 ISAM 및 이후 MyISAM은 TPM을 제외하고, 트랜잭션 레코드가 필요 없으며, ISAM 쿼리 효율성이 상당히 높고, 메모리 소모도 매우 적습니다. MyISAM은 이러한 장점을 계승하면서도 시대에 맞게 많은 유용한 신기능과 관련 도구를 제공합니다. 예를 들어, 동시성 제어를 고려할 때 테이블 레벨 락이 제공되며, MyISAM 자체는 내결함성을 지원하지 않지만 myisamchk를 통해 실패 복구에 사용할 수 있습니다. 또한 MyISAM은 각 테이블마다 독립적인 저장 파일(MYD 데이터 파일과 MYI 인덱스 파일)을 사용하기 때문에 백업 및 복원이 매우 편리하며(복사 덮어쓰기만 충분합니다), 온라인 복구도 지원합니다. 다른 스토리지 엔진과 비교했을 때, MyISAM은 테이블 점검 및 복구를 위한 대부분의 도구를 갖추고 있습니다. MyISAM 테이블은 압축이 가능하며, 전체 텍스트 검색을 지원합니다. 트랜잭션 안전하지 않고 외래 키를 지원하지 않기 때문에, 만약 애플리케이션이 트랜잭션을 요구하지 않고 기본 CRUD 작업만 처리한다면 MyISAM이 적합합니다. InnoDB는 MVCC(다중 버전 동시성 제어)와 행 레벨 락을 사용하여 ACID 준수 트랜잭션 지원을 제공하며, 고동시성 읽기 및 쓰기 상황을 위해 설계되었습니다. InnoDB는 외래키 참조 무결성을 지원하며 결함 복구 기능을 갖추고 있습니다. 또한, InnoDB의 성능은 공식적으로 대량의 데이터를 처리할 때 매우 우수합니다: InnoDB의 CPU 효율성은 다른 디스크 기반 관계형 데이터베이스 저장 엔진과 비교할 수 없습니다. 하지만 InnoDB의 백업 및 복구는 다소 까다로운데, 버전 4.1 이후 제공된 멀티테이블스페이스 지원을 사용하지 않는 한, MyISAM과 달리 InnoDB의 데이터 파일이 각 테이블에 독립적으로 대응하지 않기 때문입니다. 대신 공유 테이블스페이스를 사용하며, 단순한 복사 덮어쓰기 방식은 적합하지 않아 MYSQL 중지 후 데이터를 복원해야 합니다. 테이블별 테이블스페이스를 사용하면 각 테이블이 별도의 테이블스페이스 파일에 대응하게 되어 상황이 훨씬 간단해집니다. BDB 타입과 동일한 특성을 가지며, 외래 키도 지원합니다. InnoDB 테이블은 빠르고 BDB보다 기능이 풍부하기 때문에, 트랜잭션 보안 스토리지 엔진이 필요하다면 추천합니다.
일반적으로 InnoDB는 트랜잭션 지원이 필요하고 읽기 및 쓰기 빈도가 높은 경우 좋은 선택입니다. 동시 읽기와 쓰기 빈도가 높지 않을 경우 BDB를 고려할 수 있지만, MySQL 5.1 이후 버전에서는 BDB가 더 이상 지원되지 않습니다. 이 옵션은 사라졌습니다
기본적으로 InnoDB 트랜잭션은 열려 있습니다(자동 커밋 = 0 설정). 즉, 레코드가 삽입될 때마다 InnoDB 테이블이 이를 별도의 트랜잭션으로 처리합니다. 예를 들어 10,000개의 레코드를 삽입하고 트랜잭션을 닫지 않으면, InnoDB 타입 테이블은 이를 10,000건의 트랜잭션으로 처리하며, 이 시점의 총 삽입 시간이 매우 깁니다. 이 시점에서는 먼저 트랜잭션을 끄고 삽입해야 하므로 속도가 매우 빠릅니다. 힙과 BDB(버클리 DB)의 경우, 상대적으로 침투율은 이전 두 것만큼 좋지 않지만, 경우에 따라 힙 스토리지 엔진은 여전히 매우 유용하며, 메모리에 데이터를 저장하고 디스크 입출력 대기가 없어 매우 빠릅니다. 하지만 메모리 저장 엔진이기 때문에 서버가 재시작되면 변경된 모든 내용은 사라집니다. 힙은 DMB를 테스트하기에 아주 좋은 곳으로, MySQL 최초의 트랜잭션 보안 스토리지 엔진입니다. 버클리 DB 데이터베이스 라이브러리를 기반으로 구축되었으며 트랜잭션 보안도 갖추고 있지만, BDB는 InnoDB만큼 인기가 많지는 않습니다. 왜냐하면 트랜잭션을 지원하는 MySQL의 대부분 스토리지 엔진은 MVCC 또는 행 수준 잠금 스토리지 엔진을 찾는 반면, BDB는 페이지 수준 락만 지원하기 때문입니다.
InnoDB 엔진
InnoDB는 롤백을 지원하는 트랜잭션 스토리지 엔진으로, 대량의 데이터를 처리할 때 고성능 서비스를 제공하도록 설계되었으며, 런타임에 메모리에 버퍼 풀을 설정하여 데이터와 인덱스를 버퍼링합니다.
InnoDB 엔진의 장점:
1. 트랜잭션 처리 및 ACID 트랜잭션 기능 지원;
2. SQL 표준의 네 가지 격리 수준이 구현됩니다;
3. 행 수준 락 및 외래 키 제약 조건 지원;
4. 거래 기록을 데이터 복구에 사용할 수 있습니다.
5. 락 레벨은 행 락으로, 높은 동시성을 가진 빈번한 테이블 수정에 적합하며, 고동시성은 MyISAM보다 우수합니다. 단점은 시스템 소비량이 크다는 점입니다.
6. 인덱스는 스스로를 캐시할 뿐만 아니라 데이터를 캐시하는데, 이는 MyISAM보다 더 많은 메모리를 요구합니다.
InnoDB 엔진의 단점:
테이블의 행 수를 저장하지 않기 때문에, COUNT 통계를 사용할 때는 전체 테이블을 스캔합니다.
MyISAM 엔진
MyISAM은 MySQL 5.5.5 이전의 기본 엔진이며 빠르게 읽도록 설계되었습니다.
MyISAM 엔진의 장점:
1. 고성능 독서;
2. 테이블의 행 수를 저장하기 때문에 COUNT 통계를 사용할 때 전체 테이블을 스캔하지 않습니다;
MyISAM 엔진의 단점:
1. 잠금 레벨은 테이블 락이며, 워치 락의 장점은 오버헤드가 작고 락이 빠르다는 점입니다; 단점은 잠금의 세분화가 크고, 잠금장치 임펄스가 발생할 확률이 높으며, 동시성 용량이 낮아 쿼리 기반 서비스에 적합하다는 점입니다.
2. 이 엔진은 트랜잭션이나 외래 키를 지원하지 않습니다.
3. INSERT와 UPDATE 연산은 전체 테이블을 잠가야 합니다;
4. 테이블의 행 수를 저장하므로, SELECT COUNT(*)를 테이블에서 사용할 때 전체 테이블을 스캔하지 않고 저장된 값만 직접 읽으면 됩니다.
적용 가능한 시나리오
MyISAM은 다음에 적합합니다: (1) 많은 카운트 계산; (2) 삽입은 드물고 질의는 매우 빈번합니다; (3) 사업이 없다.
InnoDB는 다음 용도에 적합합니다: (1) 높은 신뢰성 요구사항 또는 트랜잭션; (2) 테이블 업데이트와 쿼리가 매우 자주 이루어지며, 테이블 잠금이 발생할 확률이 비교적 높습니다.
표 비교
| 특성 | 마이이삼 | 힙 | BDB | 인노DB | | 거래 내역 | 지원되지 않음 | 지원되지 않음 | 지지하는 | 지지하는 | | 잠금 세분성 | 테이블 락 | 테이블 락 | 페이지 잠금(페이지, 8KB) | 잠금장치 | | 보관 | 분할 파일 | 추모 | 테이블당 파일 하나 | 테이블 공간 | | 격리대 | 안 | 안 | 읽기, 커밋드 | 모두 | | 휴대용 포맷 | 있다 | 해당 없음 | 안 | 있다 | | 인용 완전성 | 안 | 안 | 안 | 있다 | | 데이터 기본 키 | 안 | 안 | 있다 | 있다 | | MySQL 데이터 레코드를 캐시합니다 | 안 | 네 | 네 | 네 | | 사용성 | 전체 버전 | 전체 버전 | MySQL-Max | 전체 버전 |
세부 사항에서 몇 가지 차이점이 있습니다
1. InnoDB는 MySQL 5.6(실험 버전)부터 지원해온 FULLTEXT 유형의 인덱스를 지원하지 않습니다.
2. InnoDB는 테이블의 특정 행 수를 저장하지 않습니다. 즉, 테이블에서 select count()를 실행할 때 InnoDB는 전체 테이블을 스캔해 행 수를 계산해야 하지만, MyISAM은 저장된 행 수만 읽으면 됩니다. count() 문장에 where 조건이 포함되어 있을 때, 두 테이블 모두 연산이 동일하다는 점에 유의하세요.
3. AUTO_INCREMENT 유형의 필드의 경우, InnoDB는 해당 필드만 포함하는 인덱스를 포함해야 하지만, MyISAM 테이블에서는 다른 필드와 공동 인덱스를 만들 수 있습니다.
4. DELETE FROM table에서는 InnoDB가 테이블을 다시 생성하지 않고 한 줄씩 삭제합니다.
5. 마스터에서 테이블 로드 작업은 InnoDB에서 작동하지 않습니다. 해결책은 먼저 InnoDB 테이블을 MyISAM 테이블로 변경한 후 데이터를 가져오고, 그 다음 InnoDB 테이블로 변경하는 것이지만, 외래키 등 추가 InnoDB 기능을 사용하는 테이블에는 적용되지 않습니다.
6. 또한, InnoDB 테이블의 행 잠금은 절대적이지 않으며, MySQL 명령 실행 시 스캔할 범위를 결정하지 못하면 InnoDB 테이블 전체가 잠깁니다.
7. InnoDB는 전체 텍스트 인덱싱을 지원하지 않지만, MyISAM은 지원합니다. 전체 텍스트 색인화는 char, varchar, 텍스트(정지어 제외)의 각 단어에 대해 역순 인덱스를 만드는 것을 의미합니다. MyISAM의 전체 텍스트 색인은 사실 쓸모가 없는데, 중국어 단어 분할을 지원하지 않고, 단어 분할 후 사용자가 데이터 테이블에 기록해야 하며, 4자 미만의 중국어 단어는 정지어처럼 무시됩니다.
|