현재 웹 프로젝트의 데이터베이스로 MySQL을 사용하고 있습니다. 저는 MySQL을 처음 사용합니다. InnoDB와 MyISAM의 차이점을 설명해주세요.
현재 웹 프로젝트의 데이터베이스로 MySQL을 사용하고 있습니다. 저는 MySQL을 처음 사용합니다. InnoDB와 MyISAM의 차이점을 설명해주세요.
답변:
ISAM = Indexed Sequential Access Method이며 기본적으로 플랫 파일입니다 (Btrieve 또는 B-Tree를 기억하고 생각할 수있는 DBA의 경우). 그것은 매우 오래된 기술이지만 그것을 사용하지 못하게하십시오. 플랫 파일 (나중에 자세히 설명)이므로 관계형이 아니므로 RDBMS가 아니므로 일부 상황에서 더 적합합니다.
InnoDB는 가장 친숙한 전체 RDBMS입니다. MyISAM은 링크, 논리 및 참조 무결성을 유지하는 추가 된 다른 계층을 통해 관계가있는 것처럼 보일 수 있습니다.
ISAM은 많은 레코드 (예 : 2 천만 개)가 있고 레코드가 대부분 독립형 인 경우 (즉, 관련 데이터를 검색하기 위해 많은 링크를 수행 할 필요가없는 경우) 훌륭합니다. 인덱스에 매우 크게 의존하며 올바른 인덱스가 없으면 매우 긴 쿼리 시간을 준비하십시오. 적절한 사례 : 20M + 레코드가있는 Btrieve ISAM 테이블이 있었고 정확한 인덱스를 기반으로 데이터를 검색하고 필터링하는 작업은 거의 즉각적이었습니다. 잘못된 색인을 사용하는 것은 말 그대로 15 분입니다.
InnoDB는 관계형 링크가 많은 경우 유용합니다. 표 A는 표 B의 필드를 참조하며, 표 C 및 D를 참조합니다. InnoDB는 모든 종류의 멋진 조인 방법 (해시 조인 등)을 사용하여 이러한 레코드를 가져올 수 있지만 ISAM 데이터베이스는 모든 단일 쿼리마다 여러 개의 하위 쿼리를 실행해야합니다 행을 수동으로 기록하십시오.
당신이 그것보다 훨씬 더 자세한 내용을 원한다면 실제로 데이터베이스에서 과정을 수행해야합니다!
게임에 조금 늦었지만 ... 여기 에 몇 달 전에 쓴 MYISAM과 InnoDB의 주요 차이점을 자세하게 설명한 포괄적 인 게시물이 있습니다. 컵파 (아마도 비스킷)를 잡고 즐기십시오.
MyISAM과 InnoDB의 주요 차이점은 참조 무결성과 트랜잭션에 있습니다. 잠금, 롤백 및 전체 텍스트 검색과 같은 다른 차이점도 있습니다.
참조 무결성은 테이블 간의 관계가 일관되게 유지되도록합니다. 보다 구체적으로 말하면, 테이블 (예 : 리스팅)에 다른 테이블 (예 : 제품)을 가리키는 외래 키 (예 : 제품 ID)가 있고, 지정된 테이블에 대한 업데이트 또는 삭제가 발생하면 이러한 변경 사항이 연결에 연결됩니다. 표. 이 예에서 제품 이름이 바뀌면 연결 테이블의 외래 키도 업데이트됩니다. '제품'테이블에서 제품을 삭제하면 삭제 된 항목을 가리키는 모든 목록도 삭제됩니다. 또한 새 목록에는 유효한 기존 항목을 가리키는 외래 키가 있어야합니다.
InnoDB는 관계형 DBMS (RDBMS)이므로 참조 무결성이 있지만 MyISAM은 그렇지 않습니다.
테이블의 데이터는 SELECT, INSERT, UPDATE 및 DELETE와 같은 DML (Data Manipulation Language) 문을 사용하여 관리됩니다. 트랜잭션 그룹은 둘 이상의 DML 문을 단일 작업 단위로 함께 묶으므로 전체 단위가 적용되거나 적용되지 않습니다.
MyISAM은 트랜잭션을 지원하지 않지만 InnoDB는 지원합니다.
MyISAM 테이블을 사용하는 동안 작업이 중단되면 작업이 즉시 중단되고 작업이 완료되지 않은 경우에도 영향을받는 행 (또는 각 행 내의 데이터)이 영향을받습니다.
원 자성이있는 트랜잭션을 사용하기 때문에 InnoDB 테이블을 사용하는 동안 작업이 중단되면 커밋이 수행되지 않으므로 완료되지 않은 트랜잭션은 적용되지 않습니다.
MyISAM 테이블에 대해 쿼리를 실행하면 쿼리하는 전체 테이블이 잠 깁니다. 이는 후속 쿼리가 현재 쿼리가 완료된 후에 만 실행됨을 의미합니다. 큰 테이블을 읽거나 읽기 및 쓰기 작업이 자주 발생하는 경우 쿼리에 대한 백 로그가 엄청날 수 있습니다.
쿼리가 InnoDB 테이블에 대해 실행될 때 관련된 행만 잠기고 나머지 테이블은 CRUD 작업에 사용할 수 있습니다. 이는 동일한 행을 사용하지 않는 한 동일한 테이블에서 쿼리를 동시에 실행할 수 있음을 의미합니다.
InnoDB의이 기능은 동시성이라고합니다. 동시성이있는 한, 엄선 된 테이블 범위에 적용되는 주요 단점이 있습니다. 커널 스레드간에 전환하는 데 오버 헤드가 있으므로 서버가 중지되지 않도록 커널 스레드에 제한을 설정해야합니다. .
MyISAM에서 작업을 실행하면 변경 사항이 설정됩니다. InnoDB에서는 이러한 변경 사항을 롤백 할 수 있습니다. 트랜잭션을 제어하는 데 사용되는 가장 일반적인 명령은 COMMIT, ROLLBACK 및 SAVEPOINT입니다. 1. COMMIT-여러 DML 작업을 작성할 수 있지만 COMMIT가 수행 될 때만 변경 사항이 저장됩니다. 2. ROLLBACK-아직 커밋되지 않은 작업은 모두 버릴 수 있습니다. 3. SAVEPOINT-목록에서 포인트를 설정합니다. ROLLBACK 조작이 롤백 할 수있는 조작
MyISAM은 데이터 무결성을 제공하지 않습니다. 하드웨어 장애, 불완전한 종료 및 취소 된 작업으로 인해 데이터가 손상 될 수 있습니다. 인덱스와 테이블을 완전히 복구하거나 다시 작성해야합니다.
반면 InnoDB는 트랜잭션 로그, 이중 쓰기 버퍼 및 자동 체크섬 및 유효성 검사를 사용하여 손상을 방지합니다. InnoDB는 변경하기 전에 트랜잭션 이전의 데이터를 ibdata1이라는 시스템 테이블 스페이스 파일에 기록합니다. 충돌이 발생하면 InnoDB는 해당 로그 재생을 통해 자동 복구합니다.
InnoDB는 MySQL 버전 5.6.4까지 FULLTEXT 인덱싱을 지원하지 않습니다. 이 글을 쓰는 현재 많은 공유 호스팅 제공 업체의 MySQL 버전이 여전히 5.6.4 미만이므로 InnoDB 테이블에 대해 FULLTEXT 인덱싱이 지원되지 않습니다.
그러나 이것이 MyISAM을 사용하는 유효한 이유는 아닙니다. 최신 버전의 MySQL을 지원하는 호스팅 제공 업체로 변경하는 것이 가장 좋습니다. FULLTEXT 인덱싱을 사용하는 MyISAM 테이블을 InnoDB 테이블로 변환 할 수있는 것은 아닙니다.
결론적으로 InnoDB는 기본 스토리지 엔진으로 선택해야합니다. 특정 요구에 맞는 MyISAM 또는 기타 데이터 유형을 선택하십시오.