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