>  기사  >  데이터 베이스  >  MySQL 스토리지 엔진에 대한 자세한 소개

MySQL 스토리지 엔진에 대한 자세한 소개

零下一度
零下一度원래의
2017-07-20 21:02:101250검색

 스토리지 엔진이란 무엇인가요?

  관계형 데이터베이스 테이블은 정보를 저장하고 구성하는 데 사용되는 데이터 구조입니다. 테이블은 Excel 스프레드시트 형식과 유사하게 행과 열로 구성된 테이블로 이해할 수 있습니다. 일부 테이블은 단순하고 일부는 복잡하며 일부 테이블은 장기 데이터를 전혀 저장하는 데 사용되지 않으며 일부 테이블은 읽기가 매우 빠르지만 실제 개발 프로세스에서 데이터를 삽입할 때 매우 열악합니다. 테이블이 다르다는 것은 서로 다른 유형의 데이터가 저장되며 데이터 처리에 차이가 있다는 것을 의미합니다. MySQL의 경우 다양한 유형의 스토리지 엔진을 제공하므로 MySQL의 강력한 기능을 최대한 활용하기 위해 데이터 처리 요구 사항에 따라 다양한 스토리지 엔진을 선택할 수 있습니다. 이번 블로그 포스팅에서는 각 엔진의 특징과 적용 상황을 요약 분석할 예정이며, 더 깊은 내용에 얽매이지는 않겠습니다. 나의 학습 방법은 먼저 사용법을 배우고, 사용법을 알고, 사용법을 알아내는 것입니다. 다음은 MySQL이 지원하는 스토리지 엔진에 대해 간략하게 소개합니다.

MySQL 스토리지 엔진에 대한 자세한 소개

MySQL 5.5 이상에서는 기본적으로 InnoDB 스토리지 엔진을 사용합니다. InnoDB 및 BDB는 트랜잭션에 안전한 테이블을 제공하며 다른 스토리지 엔진은 트랜잭션에 안전한 테이블이 아닙니다.

 기본 엔진을 수정하려면 구성 파일에서 default-storage-engine을 수정하면 됩니다. showvariableslike'default_storage_engine';을 사용하여 현재 데이터베이스를 기본 엔진으로 볼 수 있습니다. 명령: showengines 및 showvariableslike'have%'는 현재 데이터베이스에서 지원하는 엔진을 나열할 수 있습니다. 값이 비활성화된 것으로 표시되는 레코드는 데이터베이스가 이 엔진을 지원하며 데이터베이스가 시작될 때 비활성화된다는 것을 나타냅니다. MySQL5.1 이후에는 INFORMATION_SCHEMA 데이터베이스에 ENGINES 테이블이 제공됩니다. 다음 명령문을 사용하여 트랜잭션 처리를 지원하는 스토리지 엔진을 쿼리할 수 있습니다. ';

 Yes 데이터베이스를 생성하거나 수정할 때 사용되는 엔진을 지정하려면 엔진 키워드를 사용하세요.

  주요 저장 엔진: MyISAM, InnoDB, MEMORY 및 MERGE 소개:

  테이블 생성 시, 사용할 엔진을engine=... 또는 type=....을 통해 지정합니다. showtablestatusfromDBname은 지정된 테이블을 엔진에 표시합니다.

   (1) MyISAM

  트랜잭션이나 외래 키를 지원하지 않습니다. 특히 액세스 속도가 빠른 애플리케이션, 트랜잭션 무결성에 대한 요구 사항이 없거나 주로 SELECT 및 INSERT 애플리케이션은 기본적으로 이 엔진을 사용하여 테이블을 생성할 수 있습니다.

 각 MyISAM은 디스크에 3개의 파일로 저장되며, 파일 이름과 테이블 이름은 동일하지만 확장자는

 .frm(저장 테이블 정의)

 MYD(MYData, 저장된 데이터)

 MYI입니다. ( MYIndex, 스토리지 인덱스)

  데이터 파일과 인덱스 파일을 서로 다른 디렉터리에 배치하여 IO를 균등하게 분배하고 더 빠른 속도를 얻을 수 있습니다. 데이터 파일과 인덱스 파일의 경로를 지정하려면 테이블 생성 시 DATADIRECTORY, INDEXDIRECTORY 문을 통해 지정해야 합니다. 파일 경로는 절대 경로를 사용해야 합니다.

 각 MyISAM 테이블에는 MyISAM 데이터 테이블을 확인할 때 서버나 myisamchk 프로그램에 의해 설정되는 플래그가 있습니다. MyISAM 테이블에는 마지막 사용 후 데이터 테이블이 정상적으로 닫혔는지 여부를 나타내는 플래그도 있습니다. 서버가 다운되거나 충돌하는 경우 이 플래그를 사용하여 데이터 테이블을 확인하고 복구해야 하는지 여부를 결정할 수 있습니다. 이 검사가 자동으로 수행되도록 하려면 서버를 시작할 때 --myisam-recover 현상을 사용할 수 있습니다. 이렇게 하면 서버가 MyISAM 데이터 테이블을 열 때마다 자동으로 데이터 테이블 플래그를 확인하고 필요한 복구를 수행하게 됩니다. MyISAM 유형 테이블이 손상되었을 수 있습니다. CHECKTABLE 문을 사용하여 MyISAM 테이블의 상태를 확인하고 REPAIRTABLE 문을 사용하여 손상된 MyISAM 테이블을 복구할 수 있습니다.

 MyISAM 테이블은 3가지 다른 저장 형식도 지원합니다:

 정적(고정 길이) 테이블

 동적 테이블

 압축 테이블

 정적 테이블은 기본 저장 형식입니다. 정적 테이블의 필드는 모두 가변 길이 필드이므로 각 레코드의 길이가 고정되어 있습니다. 이 저장 방법의 장점은 매우 빠르게 저장되고 캐시가 용이하며 장애 복구가 쉽다는 것입니다. 일반적으로 동적 테이블보다 더 많은 공간을 차지한다는 점입니다. 정적 테이블은 데이터가 저장될 때 열 정의의 너비 정의에 따라 공간을 채우지만 이러한 공간은 액세스할 때 확보되지 않습니다. 이러한 공간은 애플리케이션에 반환되기 전에 제거되었습니다. 동시에 다음 사항에 유의하십시오. 경우에 따라 필드 뒤에 공백을 반환해야 할 수 있으며, 이 형식을 사용하면 후속 공백이 자동으로 처리됩니다.

  동적 테이블에는 가변 길이 필드가 포함되어 있으며 레코드는 고정 길이가 아닙니다. 이러한 저장의 장점은 공간을 적게 차지한다는 점이지만, 레코드를 자주 업데이트하고 삭제하면 OPTIMIZETABLE 문을 정기적으로 실행해야 합니다. 또는 myisamchk-r 명령을 사용하여 성능을 향상시키며, 장애 발생 시 복구가 상대적으로 어렵습니다.

 압축된 테이블은 myisamchk 도구로 생성되며 매우 작은 공간을 차지합니다. 각 레코드가 개별적으로 압축되기 때문에 액세스 오버헤드가 매우 적습니다.

  (2) InnoDB

 InnoDB는 강력한 트랜잭션 스토리지 엔진으로 많은 인터넷 회사에서 사용되었으며 사용자가 매우 큰 데이터 스토리지를 운영할 수 있는 강력한 솔루션을 제공합니다. 내 컴퓨터에는 MySQL 버전 5.6.13이 설치되어 있으며 InnoDB가 기본 스토리지 엔진입니다. InnoDB는 또한 행 수준 잠금 및 외래 키 제약 조건을 도입합니다. 다음 상황에서는 InnoDB를 사용하는 것이 가장 이상적인 선택입니다:

 1. 집약적인 테이블 업데이트. InnoDB 스토리지 엔진은 특히 여러 동시 업데이트 요청을 처리하는 데 적합합니다.

 2. 업무. InnoDB 스토리지 엔진은 트랜잭션을 지원하는 표준 MySQL 스토리지 엔진입니다.

 3. 자동 재해 복구. 다른 스토리지 엔진과 달리 InnoDB 테이블은 재해로부터 자동으로 복구할 수 있습니다.

 4. 외래 키 제약 조건. MySQL에서 외래 키를 지원하는 유일한 스토리지 엔진은 InnoDB입니다.

 5. 열 AUTO_INCREMENT 속성을 자동으로 추가하는 기능을 지원합니다.

 InnoDB 스토리지 엔진은 커밋, 롤백 및 충돌 복구 기능을 통해 트랜잭션 보안을 제공합니다. 그러나 MyISAM의 스토리지 엔진에 비해 InnoDB의 쓰기 처리 효율성은 덜 효율적이며 데이터와 인덱스를 유지하기 위해 더 많은 디스크 공간을 차지합니다.

 1) 자동 증가 열:

  InnoDB 테이블의 자동 증가 열은 수동으로 삽입할 수 있지만 삽입된 값이 비어 있거나 0인 경우 실제로 삽입되는 값은 자동 증가 후의 값입니다. 자동 증가 값의 시작 값은 "ALTERTABLE...AUTO_INCREMENT=n;" 문을 통해 강제로 설정할 수 있지만, 강제된 기본값은 메모리에 저장되며 데이터베이스가 다시 시작되면 손실됩니다. . LAST_INSERT_ID()를 사용하면 현재 스레드가 마지막으로 레코드를 삽입하는 데 사용한 값을 쿼리할 수 있습니다. 한 번에 여러 레코드가 삽입되면 첫 번째 레코드에서 사용된 자동 증가 값이 반환됩니다.

 InnoDB 테이블의 경우 자동 증가 열은 인덱스여야 합니다. 복합 인덱스인 경우 복합 인덱스의 첫 번째 열이어야 합니다. 그러나 MyISAM 테이블의 경우 자동 증가 열은 복합 인덱스의 다른 열이 될 수 있습니다. 이렇게 하면 레코드를 삽입한 후 자동 증가가 발생합니다. 복합 인덱스의 이전 열을 정렬한 후 열이 증가됩니다.

 2) 외래 키 제약 조건:

 MySQL에서 외래 키를 지원하는 유일한 스토리지 엔진은 InnoDB입니다. 외래 키 생성 시 상위 테이블에는 해당 인덱스가 있어야 하며, 하위 테이블은 생성 시 자동으로 해당 인덱스를 생성합니다. 외래 키.

인덱스를 생성할 때 부모 테이블을 삭제하거나 업데이트할 때 Restrict, Cascade, setnull 및 noaction을 포함하여 자식 테이블에 해당 작업을 지정할 수 있습니다. 그 중 제한(restrict)과 노액션(noaction)은 동일하여 하위 테이블이 관련되면 상위 테이블을 업데이트할 수 없다는 의미이고, 케이스케이드는 상위 테이블이 업데이트되거나 삭제되면 하위 테이블에 해당하는 레코드가 업데이트되거나 삭제된다는 의미입니다. setnull은 상위 테이블이 업데이트되거나 삭제되면 하위 테이블의 해당 필드가 setnull임을 의미합니다.

  다른 테이블에서 생성된 외래 키로 테이블을 참조하는 경우 해당 테이블의 해당 인덱스나 기본 키는 삭제가 금지됩니다.

 외래 키 제약 조건을 일시적으로 해제하려면 setforeign_key_checks=0;을 사용하고 제약 조건을 설정하려면 setforeign_key_checks=1;을 사용하세요.

(二)InnoDB

  (3) MEMORY

 Memory는 메모리에 저장된 내용을 이용하여 테이블을 생성합니다. 각 MEMORY 테이블은 실제로 디스크 파일에 해당하며 형식은 .frm입니다. MEMORY형 테이블 접근은 데이터가 메모리에 저장되고 기본적으로 HASH 인덱스를 사용하기 때문에 매우 빠르다. 그러나 서버가 종료되면 테이블의 데이터는 사라지지만 테이블은 계속 존재한다.

기본적으로 메모리 데이터 테이블은 해시 인덱스를 사용합니다. 이 인덱스를 사용하여 "동일성 비교"를 수행하는 것은 매우 빠르지만 "범위 비교"는 훨씬 느립니다. 따라서 해시 인덱스 값은 "=" 및 ">" 연산자에는 적합하지만 "" 연산자에는 적합하지 않습니다. 내부의 orderby 절에 사용하세요. "" 또는 그 사이의 연산자를 사용하려면 btree 인덱스를 사용하여 작업 속도를 높일 수 있습니다.

  MEMORY 데이터 테이블에 저장된 데이터 행은 일정한 길이의 형식을 사용하므로 처리 속도가 빨라집니다. 이는 BLOB, TEXT와 같은 가변 길이 데이터 형식을 사용할 수 없음을 의미합니다. VARCHAR은 가변 길이 타입이지만 MySQL 내부적으로는 고정 길이 CHAR 타입으로 처리되기 때문에 사용이 가능하다.

 createtabletab_memoryengine=memoryselectid,name,age,addrfrommanorderbyid;

 USINGHASH/BTREE를 사용하여 인덱스를 지정합니다.

 createindexmem_hashusinghashontab_memory(city_id);

MySQL 서비스 시작 시 --init-file 옵션을 사용하고, 이 파일에 insertinto...select, loaddatainfile 등의 구문을 넣어 서비스 실행 시 지속적이고 안정적으로 사용할 수 있도록 합니다. 데이터 소스에 테이블을 로드합니다.

 동시에 사용되는 MEMORY 테이블을 유지하려면 서버에 충분한 메모리가 필요합니다. MEMORY 테이블이 더 이상 사용되지 않는 경우 MEMORY 테이블이 차지하는 메모리를 해제하려면 DELETEFROM을 실행하거나 truncatetable을 실행하거나 전체 테이블을 삭제해야 합니다. .

 각 MEMORY 테이블에 배치되는 데이터의 양은 max_heap_table_size 시스템 변수에 의해 제한됩니다. 이 시스템 변수의 초기 값은 16M입니다. 동시에 MEMORY 테이블을 생성할 때 MAX_ROWS 절을 사용하여 최대 개수를 지정할 수 있습니다. 테이블의 행 수입니다.

MySQL 메모리 스토리지 엔진을 사용하는 출발점은 속도입니다. 가장 빠른 응답 시간을 얻기 위해 사용되는 논리적 저장 매체는 시스템 메모리입니다. 테이블 데이터를 메모리에 저장하면 높은 성능을 제공하지만 mysqld 데몬이 충돌하면 모든 메모리 데이터가 손실됩니다. 속도가 향상되면 몇 가지 단점이 발생합니다. Memory 데이터 테이블에 저장되는 데이터는 일정한 길이의 형식을 사용해야 하는데, 이는 BLOB, TEXT 등의 가변 길이 데이터 형식을 사용할 수 없다는 뜻이지만, VARCHAR은 가변 길이 형식이므로 MySQL 내부적으로는 처리한다. 길이가 고정된 CHAR 타입이므로 사용이 가능합니다.

  (4) MERGE

 병합 스토리지 엔진은 MyISAM 테이블 집합의 조합으로, MERGE 테이블에는 쿼리할 수 있는 데이터가 없습니다. , 업데이트 및 삭제되었습니다. 이 작업은 실제로 내부 MyISAM 테이블에서 작동합니다. MERGE 테이블에 대한 삽입 작업의 경우 삽입된 테이블은 INSERT_METHOD 절에 따라 정의됩니다. 이는 세 가지 다른 값을 가질 수 있습니다. 첫 번째 값과 마지막 값에 따라 삽입 작업이 첫 번째 또는 마지막 테이블에 적용됩니다. 이 절을 삭제하거나 NO로 설정하여 MERGE 테이블을 삽입할 수 없음을 나타냅니다. MERGE 테이블에서 삭제 작업을 수행할 수 있습니다. 이 작업은 MERGE 테이블의 정의만 삭제하고 내부 테이블에는 영향을 주지 않습니다. MERGE는 디스크에 MERGE 테이블 이름으로 시작하는 두 개의 파일을 유지합니다. .frm 파일은 테이블 정의를 저장합니다. .MRG 파일에는 MERGE 테이블이 구성되는 테이블과 그 기반을 포함하여 결합된 테이블에 대한 정보가 포함됩니다. 데이터를 삽입하는 중입니다. MERGE 테이블은 .MRG 파일을 수정하여 수정할 수 있지만, 수정 후에는 반드시 Flushtable을 통해 새로 고쳐야 합니다.

  createtableman_all(idint,namevarchar(20))engine=mergeunion=(man1,man2)insert_methos=last;

(三)MEMORY   

위 내용은 MySQL 스토리지 엔진에 대한 자세한 소개의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.