mysql 차이 8.0 - MyISAM 대 InnoDB





13 Answers

저는 데이터베이스 전문가가 아니며 경험으로 말하지 않습니다. 하나:

MyISAM 테이블은 테이블 레벨 잠금을 사용한다 . 트래픽 견적을 기반으로하면 초당 200 회의 쓰기가 발생합니다. MyISAM을 사용하면 언제든지 이들 중 하나만 진행될 수 있습니다 . 하드웨어가 오버런을 피하기 위해이 트랜잭션을 따라갈 수 있어야합니다. 즉, 단일 쿼리가 5ms를 넘지 않아도됩니다.

즉, 행 레벨 잠금을 지원하는 저장소 엔진, 즉 InnoDB가 필요할 것이라고 제안합니다.

반면에, 각 스토리지 엔진의로드를 시뮬레이트하기 위해 몇 가지 간단한 스크립트를 작성한 다음 결과를 비교하는 것은 상당히 사소한 일입니다.

mysql database performance innodb myisam

저는 데이터베이스 쓰기가 많은 프로젝트에서 작업하고 있는데, ( 70 % 삽입과 30 % 읽기 )라고 말하고 싶습니다. 이 비율에는 내가 읽은 것과 읽은 것으로 간주되는 업데이트도 포함됩니다. 읽기가 더러울 수 있습니다 (예 : 읽을 때 100 % 정확한 정보가 필요하지 않음).
문제의 작업은 1 시간에 1 백만 건이 넘는 데이터베이스 트랜잭션을 수행합니다.

MyISAM과 InnoDB의 차이점에 대해 웹에서 많은 것을 읽었습니다. MyISAM은이 작업을 위해 사용할 특정 데이터베이스 / 테이블에 대한 확실한 선택입니다. InnoDB는 행 레벨 잠금이 지원되기 때문에 트랜잭션이 필요하다면 좋을 것입니다.

아무도 이러한 유형의 부하 (또는 그 이상)에 대한 경험이 있습니까? MyISAM은 갈 길입니까?




나는 MySQL을 사용하는 대용량 시스템에서 작업했으며 MyISAM과 InnoDB를 모두 시도했다.

MyISAM의 테이블 수준 잠금으로 인해 귀하의 작업 부하와 비슷한 수준의 심각한 성능 문제가 있음을 발견했습니다. 불행히도 InnoDB에서의 성능 또한 내가 기대했던 것보다 나빴음을 발견했습니다.

결국 나는 삽입이 "핫"테이블에 들어가고 절대로 핫 테이블을 쿼리하지 않도록 데이터를 조각화하여 경합 문제를 해결했습니다.

이것은 또한 선택 쿼리에 의해 다시 접촉되지 않은 "부실"테이블에서 삭제 (데이터는 시간에 민감했으며 우리는 X 일만 유지했습니다)가 발생하도록 허용했습니다. InnoDB는 벌크 삭제시 성능이 좋지 않은 것처럼 보입니다. 따라서 데이터 삭제를 계획하는 경우 이전 데이터가 삭제 된 테이블 대신 삭제 될 수있는 오래된 테이블에 구조화하는 것이 좋습니다.

당연히 나는 당신의 애플리케이션이 무엇인지 전혀 모르겠다. 그러나 이것이 MyISAM과 InnoDB의 문제점들에 대해 약간의 통찰력을 제공하기를 희망한다.




쓰기와 읽기가 많은로드에서는 InnoDB의 이점을 누릴 수 있습니다. InnoDB는 테이블 잠금보다 행 잠금을 제공하기 때문에 서로의 SELECT 뿐만 아니라 많은 INSERT 통해 SELECT 가 동시에 수행 될 수있다. 그러나 SQL 트랜잭션을 사용하지 않는다면, InnoDB 커밋 플러시를 2 ( innodb_flush_log_at_trx_commit )로 설정하십시오. 이렇게하면 테이블을 MyISAM에서 InnoDB로 옮길 때 잃어 버릴 많은 원시 성능을 얻을 수 있습니다.

또한 복제 추가를 고려하십시오. 이것은 당신에게 약간의 스케일링을 제공하고, 당신이 읽은 것을 최신으로 할 필요는 없다고 말했기 때문에, 복제를 약간 뒤로 할 수 있습니다. 가장 큰 교통량을 따라 잡을 수 있는지 반드시 확인하십시오. 그렇지 않으면 항상 뒤떨어져 결코 따라 가지 않을 것입니다. 그러나이 방법을 사용하면 슬레이브 및 복제 지연 관리에서 데이터베이스 판독기를 분리 하는 것이 좋습니다. 응용 프로그램 코드에서이 사실을 모르는 경우 훨씬 간단합니다.

마지막으로, 다른 테이블로드에주의하십시오. 모든 테이블에서 동일한 읽기 / 쓰기 비율을 가지지는 않습니다. 100 % 가까이 읽을 수있는 작은 테이블은 MyISAM에 머물 수 있습니다. 마찬가지로 100 % 가깝게 쓰는 테이블이 있다면 INSERT DELAYED 이점을 누릴 수 있지만 MyISAM에서만 지원됩니다 ( DELAYED 절은 InnoDB 테이블에서 무시됩니다).

그러나 벤치 마크는 확실합니다.




주제를 조금 벗어나지 만, 문서 작성과 완성을 위해 다음을 추가하고 싶습니다.

일반적으로 InnoDB를 사용하면 복잡하지 않은 응용 프로그램이 훨씬 더 복잡해지며 버그가 발생하지 않을 것입니다. 모든 참조 무결성 (외래 키 - 제약)을 데이터 모델에 넣을 수 있기 때문에 MyISAM에서 필요한만큼의 애플리케이션 코드가 필요하지 않습니다.

레코드를 삽입, 삭제 또는 교체 할 때마다 관계를 확인하고 유지해야합니다. 예를 들어 부모를 삭제하면 모든 어린이도 삭제해야합니다. 예를 들어, 단순한 블로깅 시스템이라 할지라도 블로그 게시물 레코드를 지우면 주석 레코드, 좋아하는 것을 지워야 할 것입니다. InnoDB에서 이것은 데이터베이스 엔진에 의해 자동으로 수행됩니다 (모델에서 contraint를 지정한 경우). ) 응용 프로그램 코드가 필요 없습니다. MyISAM에서는 웹 서버에서 매우 어려운 애플리케이션에 코딩해야합니다. 웹 서버는 본질적으로 매우 동시 적 / 병렬 적이며, 이러한 동작은 원자 적이어야하고 MyISAM은 실제 트랜잭션을 지원하지 않으므로 웹 서버에 MyISAM을 사용하는 것은 위험하거나 오류를 발생시키기 쉽습니다.

또한 대부분의 일반적인 경우, InnoDB는 여러 가지 이유로 테이블 수준 잠금과 달리 레코드 수준 잠금을 사용할 수있는 여러 가지 이유로 더 나은 성능을 발휘합니다. 쓰기가 읽기보다 빈번한 상황뿐만 아니라 대규모 데이터 세트에서 복잡한 조인이있는 상황에서도 마찬가지입니다. 우리는 아주 큰 조인 (몇 분이 걸림)을 위해 MyISAM 테이블에서 InnoDB 테이블을 사용하는 것만으로도 3 배의 성능 향상을 보았습니다.

필자는 MySQL을 사용할 때 일반적으로 InnoDB (참조 무결성을 갖춘 3NF 데이터 모델 사용)가 기본 선택 항목이어야한다고 말합니다. MyISAM은 매우 특정한 경우에만 사용해야합니다. 가장 가능성이 적어서 더 큰 버그가있는 응용 프로그램이 만들어집니다.

이것을 말한 것. 데이터 모델링은 웹 디자이너 / 프로그래머간에 거의 찾아 볼 수없는 예술입니다. 불쾌감은 없지만, MyISAM이 너무 많이 사용된다고 설명합니다.




MyISAM을 사용하면 각 DML 문을 트랜잭션 (어떤 경우 든 크래시 발생시 내구성이 없거나 원자력이 아님)으로 간주하지 않는 한 시간당 트랜잭션을 수행 하지 않습니다.

그러므로 InnoDB를 사용해야한다고 생각한다.

초당 300 건의 거래가 꽤 많이 들립니다. 이러한 트랜잭션이 정전시에도 내구성이 있어야하는 경우 I / O 하위 시스템이 초당 많은 쓰기 작업을 쉽게 처리 할 수 ​​있는지 확인하십시오. 적어도 배터리 백업 캐시가있는 RAID 컨트롤러가 필요합니다.

내구성이 낮을 경우 innodb_flush_log_at_trx_commit을 0 또는 2로 설정하여 InnoDB를 사용할 수 있습니다 (자세한 내용은 문서 참조). 성능을 향상시킬 수 있습니다.

Google 및 다른 사용자의 동시성을 높일 수있는 패치가 많이 있습니다. 패치가 없어도 충분한 성능을 얻을 수 없다면 이러한 패치가 유용 할 수 있습니다.




MYISAM :

  1. MYISAM은 테이블 레벨 잠금 기능을 지원합니다.

  2. 속도가 필요한 MyISAM

  3. MyISAM은 외래 키를 지원하지 않으므로 MYISAM과 함께 MySQL을 DBMS
  4. MyISAM은 별도의 세 가지 파일을 사용하여 테이블, 데이터 및 색인을 디스크 공간에 저장합니다. (tablename.FRM, tablename.MYD, tablename.MYI)
  5. MYISAM은 거래를 지원하지 않습니다. MYISAM으로 커밋하고 롤백 할 수 없습니다. 명령을 실행하면 명령이 완료됩니다.

INNODB :

  1. InnoDB는 행 레벨 잠금을 지원합니다
  2. 대량의 데이터를 처리 할 때 최대의 성능을 발휘하도록 설계된 InnoDB
  3. InnoDB는 외래 키를 지원하므로 InnoDB는 MySQL이라고 부른다. RDBMS이다.
  4. InnoDB는 테이블과 인덱스를 테이블 스페이스에 저장한다.
  5. InnoDB는 트랜잭션을 지원한다. InnoDB로 커밋하고 롤백 할 수있다.






MyISAM

The MyISAM engine는 대부분의 MySQL설치 에서 기본 엔진이며 MySQL 시스템의 초기 버전에서 지원되는 원래 ISAM 엔진 유형의 파생입니다. 이 트랜잭션 기능 (사용이 부족하지만 엔진은 성능과 기능의 최적의 조합을 제공 InnoDB하거나 BDB엔진) 및 용도 table-level locking.

FlashMAX 및 FlashMAX Connect : Flash Platform 변환 선도 지금 다운로드하십시오. 트랜잭션이 필요하지 않으면 MyISAM 엔진을 사용하여 효과적으로 저장할 수없는 데이터베이스 및 응용 프로그램은 거의 없습니다. 그러나 많은 수의 데이터 삽입 / 업데이트가 읽기 횟수와 비교되는 매우 고성능 응용 프로그램은 MyISAM 엔진의 성능 문제를 야기 할 수 있습니다. 그것은 원래 MyISAM 테이블에 대한 데이터베이스 액세스의 90 % 이상이 쓰기가 아닌 읽기가 될 것이라는 생각으로 설계되었습니다.

테이블 수준 잠금을 사용하면 데이터가 추가되는 동안 테이블이 잠기므로 많은 행 삽입 또는 업데이트가있는 데이터베이스의 성능 병목 현상이 발생합니다. 다행히도이 제한은 비 트랜잭션 데이터베이스의 제한 내에서 잘 작동합니다.

MyISAM Summary

이름 - MyISAM

도입 -v3.23

기본 설치 - 예

데이터 제한 - 없음

인덱스 제한 사항 - 테이블 당 64 개의 인덱스 (32 개 4.1.2); 인덱스 당 최대 16 개의 열

트랜잭션 지원 - 아니요.

잠금 레벨 - 테이블

InnoDB

The InnoDB EngineInnobase OyMyISAM 엔진의 모든 데이터베이스 기능 (및 기타) 이 제공 하고 지원하며 전체 트랜잭션 기능 (전체 ACID(원 자성, 일관성, 격리 및 내구성) 준수)과 행 수준의 데이터 잠금을 추가합니다.

InnoDB 시스템의 핵심은 인덱스와 데이터가 디스크에 저장 될뿐만 아니라 메모리에 캐싱되는 데이터베이스, 캐싱 및 인덱싱 구조입니다. 이렇게하면 매우 빠른 복구가 가능하며 대용량 데이터 세트에서도 작동합니다. 로우 레벨 락킹을 지원함으로써, 엔진이 각 인서트로 테이블을 잠그지 않고도 InnoDB 테이블에 데이터를 추가 할 수 있으며, 이는 데이터베이스의 정보 복구 및 저장 속도를 향상시킵니다.

마찬가지로 MyISAM, InnoDB 데이터베이스에 효과적으로 저장 될 수없는 데이터 유형은 거의 없다. 사실 InnoDB 데이터베이스를 항상 사용하지 않아야하는 중요한 이유는 없습니다. 관리 오버 헤드 InnoDB는 다소 부담 스럽지만 메모리와 디스크 캐시 및 데이터베이스 파일의 크기에 대한 최적화 권한을 얻는 것은 처음에는 복잡 할 수 있습니다. 그러나이 값보다 유연성이 높아지고 일단 설정되면 성능 이점이 처음 사용 된 시간보다 쉽게 ​​클 수 있음을 의미합니다. 또는 MySQL자동으로 관리 할 수 있습니다.

서버에 InnoDB 설정을 기꺼이 (그리고 가능하게) 할 수 있다면, 서버 설정을 최적화하고 InnoDB 엔진을 디폴트로 사용하는 것이 좋습니다.

InnoDB Summary

이름 -InnoDB

소개 -v3.23 (소스 전용), v4.0 (소스 및 바이너리)

기본 설치 - 아니요

데이터 제한 - 없음

색인 제한 - 없음

트랜잭션 지원 - 예 (ACID 호환)

잠금 레벨 -Row




나는 Myisam이 잠금 경합을하고 있음에도 불구하고, 그것이 사용하는 빠른 잠금 획득 방식 때문에 대부분의 시나리오에서 InnoDb보다 여전히 빠릅니다. 저는 여러 번 Innodb을 시도해 보았고 항상 한 가지 이유 또는 다른 이유로 MyIsam으로 돌아 왔습니다. 또한 InnoDB는 거대한 쓰기로드에서 CPU를 많이 소비 할 수 있습니다.




무작위 데이터를 MyISAM 및 InnoDB 테이블에 삽입하려고했습니다. 결과는 꽤 충격적이었습니다. MyISAM은 InnoDB보다 100 만 줄을 삽입하는 데 단 몇 분 밖에 걸리지 않았습니다!




나는 이것이 인기가 없을 것임을 알고 있지만 여기에 간다 :

myISAM은 트랜잭션 및 참조 무결성과 같은 데이터베이스 필수 요소에 대한 지원이 부족하기 때문에 종종 버그가 발생하거나 버그가있는 응용 프로그램이됩니다. DB 엔진이 지원하지 않는 경우에도 적절한 데이터베이스 디자인 기본 사항을 배울 수 없습니다.

참조 무결성이나 데이터베이스 세계에서의 트랜잭션을 사용하지 않는 것은 소프트웨어 세계에서 객체 지향 프로그래밍을 사용하지 않는 것과 같습니다.

이제 InnoDB가 존재합니다. 대신에 그것을 사용하십시오! 심지어 MySQL 개발자들도 myISAM이 모든 레거시 시스템의 기본 엔진이었던 것에도 불구하고 마침내이 버전을 새로운 버전의 기본 엔진으로 변경하는 것을 인정했습니다.

읽기 나 쓰기, 성능상의 고려 사항은 중요하지 않습니다. myISAM을 사용하면 방금 실행 한 것과 같은 다양한 문제가 발생할 수 있습니다. 데이터베이스 동기화를 수행하는 동시에 다른 누군가와 myISAM에 설정된 테이블에 액세스 한 애플리케이션에 액세스했다. 트랜잭션 지원이 부족하고 일반적으로이 엔진의 안정성이 떨어짐으로 인해 전체 데이터베이스가 손상되어 수동으로 mysql을 다시 시작해야했습니다!

지난 15 년 동안 많은 데이터베이스와 엔진을 사용해 왔습니다. myISAM이이 기간 동안 12 번이나, 다른 데이터베이스를 한 번만 추락했습니다! 그리고 그것은 일부 개발자가 잘못된 CLR 코드 (공용 언어 런타임 - 기본적으로 데이터베이스 내에서 실행되는 C # 코드)를 작성한 Microsoft SQL 데이터베이스였습니다. 데이터베이스 엔진의 오류가 아닙니다.

나는 고 가용성, 고성능 애플리케이션이 작동하지 않을 때 myISAM을 사용해서는 안되며, 좌절없는 사용 환경을 제공 할만큼 견고하거나 안정적이지는 않다는 다른 답변에 동의 합니다. 자세한 내용은 Bill Karwin의 답변을 참조하십시오.

추신 : myISAM 팬이 downvote하지만이 대답의 어떤 부분이 잘못되었는지 말할 수 없을 때 그것을 사랑해.




거의 모든 새 프로젝트를 시작할 때마다 나는 새로운 대답을 생각해 내기 위해이 동일한 질문을 Google에 전합니다.

그것은 결국 아래로 귀결됩니다. - 나는 최신 버전의 MySQL을 가져 와서 테스트를 실행합니다.

키 / 값 조회를 수행 할 테이블이 있습니다 ... 그게 전부입니다. 해시 키 값 (0-512 바이트)을 가져와야합니다. 이 DB에는 많은 거래가 없습니다. 테이블은 가끔 (전체적으로) 갱신되지만 0 트랜잭션을 가져옵니다.

여기서 우리는 복잡한 시스템에 대해 이야기하지 않고 단순한 조회에 대해 이야기하고 있습니다. 테이블 RAM을 상주시키는 것 외에는 성능을 최적화 할 수 있습니다.

또한 다른 데이터베이스 (예 : NoSQL)에 대한 테스트를 통해 이점을 얻을 수있는 곳이 있는지 확인합니다. 내가 찾은 가장 큰 장점은 키 매핑이지만 조회가 진행되는 동안 MyISAM은 현재 모든 것을 토핑하고 있습니다.

하지만, MyISAM 테이블에서는 금융 거래를 수행하지 않겠지 만 간단한 조회는 일반적으로 2x ~ 5x의 쿼리 / 초를 테스트해야합니다.

그것을 시험해보십시오, 나는 토론을 환영합니다.




간단히 말해, InnoDB는 많은 INSERT 및 UPDATE 명령을 처리 할 수있는 안정적인 데이터베이스가 필요한 작업을 수행하는 경우에 유용합니다.

MyISAM은 테이블 잠금 작업의 단점을 고려하여 쓰기 (INSERT 및 UPDATES) 대신 많은 읽기 (SELECT) 명령어를 주로 사용하는 데이터베이스가 필요한 경우에 유용합니다.

당신은 체크 아웃하고 싶을지도 모른다;
InnoDB의
장점과 단점 MyISAM의 장점과 단점




Related