MySQL의 InnoDB는 높은 동시성의 원칙을 달성

MySQL의 원칙 장

MySQL의 색인 메커니즘

MySQL의 스토리지 엔진 아키텍처 및

자세한 MySQL의 문 실행 과정

상세 MySQL의 실행 계획

MySQL의 InnoDB의 버퍼 풀

MySQL의 InnoDB의 트랜잭션

MySQL의 InnoDB의 잠금

MySQL의 InnoDB의 MVCC

MySQL의 InnoDB는 높은 동시성의 원칙을 달성

RR에와 RC MySQL의 InnoDB의 차이는 무엇 읽기 스냅 샷입니다

재현 : "이노 동시에 때문에도이에, 너무 높은? "

동시성 제어

왜 통제를 병행 것인가?

중요한 자원에 대한 운영의 작업과 동시, 아무런 조치가 취해지지 않은 경우, 그것은 동시성 제어 (동시성 제어)이어야 불일치가 발생할 수 있습니다.

기술적으로, 일반적으로 어떻게 동시성 제어?

동시성 제어 수단으로 공통의 데이터 일관성을 보장한다 :

  • 锁 (잠금)
  • 다중 데이터 버전 (멀티 버전)

잠금 

어떻게 일반 잠금 일관성을 보장 사용 하는가?

  1. 동작 데이터는, 고정 전에, 상호 배타적 인 실시 예에서, 동작은 다른 동시 작업을 허용하지 않고;
  2. 작업이 완료되면, 로크는 다른 작업을 수행 할 수 있도록 해제된다;

이러한 및 일관성을 보장합니다.

일반 잠금 문제는 무엇인가? 

너무 거친 간단한 잠금 장치, 심지어는 "읽기 작업이"병렬 수 없습니다, 작업 실행은 자연 시리얼입니다. 

그래서 공유 잠금 및 독점 잠금이 있습니다 :

  • 데이터가 판독 로크 첨가되는 S (S 잠그는 잠금 공유) 공유 잠금
  • 배타적 로크 (배타적 X 잠금이라고 잠금) 플러스 데이터 X를 변경 로크

공유 잠금 및 독점 잠금이 재생됩니다 :

  • 공유 잠금은 상호 배타적으로 축약하지 않습니다 : 병렬로 읽기
  • 병렬로 쓰기, 읽기, 쓰기하지 : 독점 잠금 약칭 어떤 로크의 배타적 

우리는 작업이 데이터를 작성 완료되지되면, 데이터 동시성의 정도에 더 큰 영향을 줄 다른 작업에 의해 읽을 수없는 것을 볼 수 있습니다.

그것은 더 동시성에게 그것을 개선 할 수 있습니까?

심지어 완료되지 않은 작업을 쓰기 작업이 다른 읽기, 데이터의 여러 버전을 리드 복잡 할 수있다.

데이터의 여러 버전 

동시성 데이터는 상기 방법을 개선 할 수있는 다중 버전, 핵심 원리는 :

  1. 쓰기 작업이 발생하면, 버전 번호의 데이터 복제 사본을 구별;
  2. 제출 때까지, 새로운 복제에 대한 데이터를 조작 쓰기 태스킹;
  3. 동시 읽기 작업은 데이터의 이전 버전을 읽을 계속 할 수 있고, 방해하지 않을 것이다;

 

그림으로 : 

  1. 데이터의 시작 버전은 V0이다;
  2. T1 시간은 데이터 복제, 편집이 버전은 V1이되고있는 쓰기 작업을 시작하지만 작업이 완료되지 않은;
  3. 판독 작업과 T2 시간 동시, 당신은 여전히 ​​데이터의 V0 버전을 읽을 수 있습니다;
  4. T3의 순간 판독 작업에 의해 복잡, 여전히 차단하지 않습니다; 

그것은 "데이터의 이전 버전을 읽기"크게 향상시킬 수있는 동시 작업을 통해 데이터의 여러 버전을 볼 수 있습니다.

경우에 아이디어의 동시 발전을 향상 :

  • 통상의 잠금은 기본적으로 일련의 실행이며
  • 읽기 - 쓰기 잠금, 당신은 동시 읽기를 얻을 수 있습니다
  • 데이터의 여러 버전, 당신은 동시 읽기 및 쓰기를 얻을 수 있습니다 

글쎄, 그것을 재생하는 방법을 구체적으로 이노에 해당? 

redo, undo, 시간 滚段 

전에 더 InnoDB의 사용 방법을 설명 동시성이 크게 작업을 개선 "데이터의 이전 버전을 읽기", 다음 리두 로그, 취소 로깅, 롤백 (도입 할 필요가 롤백 세그먼트).

왜 로그를 다시 실행해야합니까?

데이터베이스 트랜잭션이 커밋 된 후, 업데이트 된 데이터는 ACID 속성을 보장하기 위해, 디스크에 닦았해야합니다. 모든 브러시 판은 크게 데이터베이스의 처리량에 영향을 미칠 경우 디스크 임의 쓰기 성능은 낮습니다.

최적화 방법은 리두 로그에 대한 첫 번째 기록의 동작 (순차적 쓰기에이 시간)을 수정 한 다음 정기적으로 디스크에 데이터를 솔질하는 것입니다, 이것은 성능을 크게 향상시킬 수 있습니다.

여기 아키텍처 설계 방식은 순차적 인 쓰기에 최적화 된 임의 쓰기는 아이디어가 더 중요하다는 것이다.

어떤 시점에서, 데이터베이스가 충돌하는 경우, 데이터베이스의 브러쉬 디스크 데이터에 충분한 시간은 트랜잭션이 디스크에 브러시에 의해 생성 된 데이터에 미치는 영향에 제출되었는지 확인하기 위해, 내용에 리두 로그를 재실행, 다시 시작됩니다.

워드는 리두 로그는 커밋 된 트랜잭션의 ACID 속성을 보호하는 데 사용됩니다.

왜 로그를 취소해야합니까?

데이터베이스 커밋되지 않은 트랜잭션이 트랜잭션이 수정 된 데이터를 미러링 할 때 (즉, 개정 전에 이전 버전) 벤 붕괴 또는 데이터베이스, 당신은 로그인 취소 할 수 있습니다 때 트랜잭션이 롤백 실행 취소 로그에 저장된 데이터의 이전 버전, 취소 데이터베이스에 대한 트랜잭션의 영향은 커밋 생성.

  • 삽입 작업을 위해, 기록 새로운 데이터 PK (ROW_ID), 삭제 롤백 로그 취소;
  • 삭제 / 업데이트 작업의 경우, 이전 데이터 행, 직접 롤백 복구를 기록 취소;
  • 그들은 다른 버퍼 내부에 보관 하였다.

말씀은, 로그가 ACID 속성 데이터베이스에 영향을주지 않습니다 트랜잭션을 커밋하지 않도록 보호하는 데 사용됩니다 취소.

롤백은 무엇인가? 

실행 취소 로그를 저장하는 장소는 롤백입니다. 

MVCC 취소 로그와 롤백 세그먼트와 InnoDB는 밀접하게 펼쳐 설명하기 위해 예를 들어이, 관련이 있습니다.

表 : t (PK ID, 이름);

데이터 :

1 shenjian

2, zhangsan

3, 용해

이 시점에서이 커밋되지 않은 트랜잭션이 없으므로 롤백이 비어 있습니다.

그런 다음 트랜잭션을 시작합니다 :

TRX 시작;
삭제 ( 1 , shenjian);
업데이트  세트 ( 3 , 리시)  ( 3 , XXX);
삽입 ( 4 , wangwu);

당신은 볼 수 있습니다 :

  • 전 (1, shenjian) 롤백에의 데이터의 이전 버전으로 삭제됩니다;
  • 롤백에의 데이터의 이전 버전 (3, 리시) 변형 전에;
  • 데이터 롤백에, (4) PK를 삽입하는 단계;

다음, 트랜잭션 ROLLBACK 경우 ,이 시간은 실행 취소 로그 롤 롤백에 의해, 수 있습니다 트랜잭션 커밋을 가정 , 실행 취소 로그에 롤백 세그먼트는 삭제할 수 있습니다.

당신은 볼 수 있습니다 :

  • 삭제 된 데이터를 복원;
  • 또한 복구 이전 데이터를 수정;
  • 데이터 삭제, 삽입하는 단계;

트랜잭션 롤백은 모두 이전과 성공이다.

이노 스토리지 엔진은 다중 버전 동시성 제어에 기초

MVCC는 동시 트랜잭션에 의해 감소 ​​잠금 충돌 "데이터의 이전 버전을 읽기", 동시성 작업을 개선하는 것입니다.

핵심 문제 :

  1. 데이터의 이전 버전은 저장?
  2. MySQL과 InnoDB의 원래 구조에 큰 영향이 있는지 여부, 데이터의 이전 버전을 저장?

방법의 실행 취소하고 위의 롤백 로그를 포장하여,이 두 가지 문제는 아주 좋은 답변입니다 : 

  1. 이전 버전의 데이터가 롤백에 저장된다;
  2. 시스템의 MySQL과 InnoDB의 원래 아키텍처는 거의 영향을 미치지;

InnoDB의 커널은 모든 행 데이터는 3 개 개의 내부 속성을 증가시킬 것이다 : 

  1. DB_TRX_ID, 6 바이트, 각 레코드 변화의 트랜잭션 ID의 마지막 줄;
  2. DB_ROLL_PTR, 7 바이트, 로그 포인터 롤백 취소 기록하는 단계;
  3. DB_ROW_ID 6 바이트 단조 광고 ID를 증가시키는 단계;

이러한 높은 동시성을 할 이유는 InnoDB의 수?

데이터의 롤백 세그먼트는 사실, 이러한 데이터는 아무것도 동시 그들을 읽고 할 수있는 선택, 수정되지 않습니다 기록 데이터 (스냅 샷)의 스냅 샷입니다.

스냅 샷 (읽기 스냅 샷)를 읽어 ,이 일관성는 잠금 해제 읽기 (일관된 Nonlocking 읽기), 그것은 동시에 매우 높은 이노의 핵심 이유 중 하나입니다.

일관성이 여기 하나 기존의 데이터에 대한 트랜잭션이 시작되기 전에, 데이터를 읽을 수있는 거래이며, 거래 그 자체에 삽입 또는 데이터를 수정 (물론, 생성 된 또 다른 커밋 된 트랜잭션입니다). 

읽어 무엇의 스냅 샷을 선택?

쇼 잠금하지 않는 한, 선택 문장의 일반 스냅 샷은 예를 들어, 읽기 :

선택  *  에서 t 여기서 ID > 2 ;

여기에 표시 잠금, 스냅 샷이 아닌 읽기를 말합니다 :

선택  *  에서 t 어디 ID > 2 잠금 에서 공유 모드;
선택  *  에서 t 여기서 ID > (2)  에 대한  업데이트 ;

개요 

  • 일반적인 동시성 제어 방법은 데이터 일관성 잠금, 데이터의 여러 버전을 보장하기 위해;
  • 일반 로크 직렬, 병렬 판독 기입 로크는 멀티 버전은 데이터를 병렬로 판독 및 기입;
  • 커밋 된 트랜잭션 ACID 속성을 보장하기 위해 로그를 다시 실행, 설계 아이디어는 임의 쓰기, 대체에 의한 순차 쓰기 증가 동시성이다;
  • 취소가 롤백에 저장되어 롤백되지 않은 트랜잭션에 로그인;
  • MVCC는 용도 취소 로그 데이터의 이전 버전이 동시에 개선하는 것이에서 롤백에 저장된 이노 스토리지 엔진에 기반한다;
  • 높은 동시 InnoDB하지만, 읽기 스냅 샷 잠금이 해제 이유;
  • InnoDB는 모든 일반적인 스냅 샷 읽기를 선택이다;

이 논문의 지식은 MySQL5.6을 기반으로합니다.

추천

출처www.cnblogs.com/yinjw/p/11895689.html