[mysql] MySQL의 InnoDB 및 MyISAM은 무엇입니까?

무엇 InnoDBMyISAMMySQL?



답변

InnoDBMYISAM, 스토리지 엔진이다 MySQL.

이 두 가지는 잠금 구현에서 다릅니다 InnoDB. 테이블의 특정 행을 MyISAM잠그고 전체 MySQL테이블을 잠급니다 .

DB에서 테이블을 생성하는 동안 MYISAMOR InnoDB을 주어 타입을 지정할 수 있습니다 .


답변

보세요

InnoDBMyISAM

InnoDB는 MySQL 용 스토리지 엔진으로, MySQL AB에서 배포하는 모든 최신 바이너리에 표준으로 포함되어 있습니다. MySQL과 함께 사용할 수있는 다른 스토리지 엔진에 비해 주요 개선 사항은 ACID 호환 트랜잭션 지원입니다.

MyISAM은 5.5 1 이전의 MySQL 관계형 데이터베이스 관리 시스템 버전의 기본 스토리지 엔진입니다 . 이전 ISAM 코드를 기반으로하지만 유용한 확장 기능이 많이 있습니다.
MyISAM의 주요 결함은 거래 지원이 없다는 것입니다.
MySQL 5.5 이상 버전은 참조 무결성 제약과 더 높은 동시성을 보장하기 위해 InnoDB 엔진으로 전환되었습니다.


답변

그들은 저장 엔진입니다.

http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html

MyISAM : 기본 MySQL 스토리지 엔진이며 웹, 데이터웨어 하우징 및 기타 애플리케이션 환경에서 가장 많이 사용되는 엔진입니다. MyISAM은 모든 MySQL 구성에서 지원되며 기본적으로 다른 구성을 사용하도록 MySQL을 구성하지 않는 한 기본 스토리지 엔진입니다.

InnoDB : 사용자 데이터를 보호하기위한 커밋, 롤백 및 충돌 복구 기능이있는 MySQL 용 트랜잭션 안전 (ACID 호환) 스토리지 엔진입니다. InnoDB 행 수준 잠금 (더 거친 세분성 잠금으로 에스컬레이션하지 않음) 및 Oracle 스타일의 일관된 비 잠금 읽기는 다중 사용자 동시성과 성능을 향상시킵니다. InnoDB는 사용자 데이터를 클러스터형 인덱스에 저장하여 기본 키를 기반으로하는 일반적인 쿼리에 대한 I / O를 줄입니다. 데이터 무결성을 유지하기 위해 InnoDB는 FOREIGN KEY 참조 무결성 제약 조건도 지원합니다.


답변

테이블 당 특정 스토리지 엔진을 지정할 수있는 기능이 MySQL의 주요 강점 중 하나라는 점을 추가하고 싶었습니다 (사용하기 쉽고 조정 없이도 좋은 성능을 제공함). 트랜잭션이 필요한 모든 작업의 ​​경우 InnoDB를 사용하십시오. 그러나 MyISAM은 특정 상황에서 트랜잭션이 필요하지 않을 때 실제로 속도를 높일 수 있으며 InnoDB에 비해 디스크 공간과 RAM이 더 적게 필요합니다.

즉, InnoDB는 항상 좋아지고 있습니다.

InnoDB 1.1 성능 및 확장 성 향상


답변

MyISAM은 데이터의 무결성을 유지하기 위해 트랜잭션을 따르는 InnoDB와 달리 ACID를 따르지 않습니다.

MyISAM은 동시 삽입을 지원합니다. 테이블에 데이터 파일 중간에 사용 가능한 블록이 없으면 다른 스레드가 테이블에서 읽는 동시에 새 행을 테이블에 삽입 할 수 있습니다. MySqlDoc

그렇기 때문에 MyISAM은 더 빠르고 공간을 덜 차지합니다. 예를 들어 MySQL MyISAM 스토리지 엔진은 트랜잭션을 지원하지 않습니다. MySQL MYISAM의 제약 조건 동시 삽입 이라는 비트 가 있습니다
. 기본적으로 변수는 1로 설정되고 동시 삽입은 방금 설명한대로 처리됩니다. 0으로 설정하면 동시 삽입이 비활성화됩니다. 2로 설정하면 행을 삭제 한 테이블에서도 테이블 끝에 동시 삽입이 허용됩니다. INSERT 문을 실행하여 테이블 중간에 구멍이 없거나 삭제 된 행이없는 경우 (동시 삽입시) select와 함께 테이블 끝에 행을 추가 할 수 있습니다.

mysql InnoDB의 기본 격리 수준은 “반복 읽기”입니다. MyISAM의 경우 거래가 없습니다. InnoDB는 행 수준 잠금을 사용하는 반면 MyISAM은 테이블 수준 잠금 만 사용할 수 있기 때문에 InnoDB는 충돌 취소가 MyISAM보다 낫습니다. 동시성 효과를 피하려면 MyISAM에서 테이블 수준 잠금수동으로 획득해야합니다 .


답변

InnoDB 는 MySQL의 트랜잭션 스토리지 엔진 인 반면 MyISAM 은 비 트랜잭션 스토리지 엔진입니다. 즉, InnoDB는 데이터의 무결성을 유지하기 위해 ACID 속성을 따르지만 MyISAM은 ACID 속성을 따르지 않아 데이터의 무결성을 유지하지 못합니다.

InnoDB (트랜잭션) 테이블에서 롤백이 필요한 경우 트랜잭션 변경을 쉽게 취소 할 수 있습니다. 그러나 트랜잭션 롤백이 필요한 경우 MyISAM (비 트랜잭션) 테이블에 대한 변경 사항은 취소 할 수 없습니다.

예를 들어, 당좌 예금 계좌에서 저축 계좌로 돈을 이체하려고합니다. 이는 5 개의 쿼리를 포함하는 트랜잭션에 의해 수행됩니다.

1 START TRANSACTION;
2 SELECT balance FROM checking WHERE customer_id = 10233276;
3 UPDATE checking SET balance = balance - 200.00 WHERE customer_id = 10233276;
4 UPDATE savings SET balance = balance + 200.00 WHERE customer_id = 10233276;
5 COMMIT;

4 단계에서 프로세스가 충돌한다고 가정합니다. 여기에 InnoDB 테이블이 사용 된 경우 롤백을 수행하면 변경 사항이 취소되고 손실 위험에서 벗어날 수 있습니다. 말 그대로, 테이블은 5 단계가 성공적으로 실행되지 않으면 변경 사항이 테이블에 커밋되지 않으므로 충돌을 인식하지 못합니다.

그러나 MyISAM 테이블의 경우 롤백이 호출되거나 트랜잭션 실패로 이어지는 충돌이 발생하면 트랜잭션 변경 사항을 취소 할 수 없습니다. 즉, 3 단계에서 거래가 중단되면 당좌 예금 계좌에서 돈이 공제됩니다. 그러나 돈은 저축 계좌에 추가되지 않았을 것입니다.

예제 제공 : “고성능 MySQL : 최적화, 백업 및 복제”-Arjen Lentz, Derek J. Balling, Jeremy Zawodny, Peter Zaitsev 및 Vadim Tkachenko 저서


답변

MySQL 서버가 충돌하면 큰 InnoDB 트랜잭션 파일보다 MyISAM 테이블 세트에서 데이터를 훨씬 쉽게 복구 할 수 있습니다. 각 MyISAM 테이블에는 별도의 파일이 있으며 충돌 중에이 테이블에 대한 쓰기 작업이 수행되지 않은 경우에는 완전히 영향을받지 않습니다. InnoDB의 경우 전체 MySQL 서버의 전체 트랜잭션 파일을 다시 인덱싱하거나 크래시 후 수행하는 작업을 다시 만들어야합니다. 꽤 지저분해질 수 있습니다.