MySQL의-SQL 튜닝

이 문서에서는 SQL 기반의 어느 정도이지만, 같은 매우 SQL 누가 명확하지 인덱스 튜닝 모드의 사용으로 문제가있는 경우, 그가 사용하는 방법을 지적했다.

이 문서는 순수한 원래없는 이전 블로그의 조합, 자신의 블로그에 대한 요약을 작성합니다.

 

MySQL은 사용의 컬렉션을 조인 https://blog.csdn.net/lukabruce/article/details/80568796

 

지수 하위 라이브러리 하위 테이블, SQL 표현 등은 SQL 성능에 영향을 미칠 것입니다.

개념 :

1. 데이터베이스 트랜잭션 ACID 속성

데이터베이스 트랜잭션의 4 기능 :
원 자성 (원자) :
 트랜잭션에서 작업하는 복수의 통합, 또는이다 성공 또는 실패, 모 아니면도.
일관성 (일관성) :  트랜잭션 작업 후하는 데이터베이스의 상태 비즈니스 규칙은 동일하다 예를 들어, 각각의 전송 후, B 계정 변하지 총량,
분리 (단리)  같은 같은 여러 트랜잭션의 직렬 실행 사이가 서로 영향을 미치지 않는,
영구 (내구성)  트랜잭션이 커밋 된 후 영구 저장에 지속되었다.

 

RC과 RR 분리 레벨 사이 3. MySQL의 차이

MySQL의 데이터베이스 기본 격리 수준 RR,하지만 현실은 RC과 RR 분리 레벨의 사용이 많은 점이다. Taobao의처럼, RC NetEase는이 격리 수준을 사용하고 있습니다. 그래서 차이점은 MySQL의 RC과 RR에합니까? 우리는 어떻게 선택합니까? 왜 기본 RR 격리 수준이 같은 MySQL은?

4. RC 잠금 측면에서 RR 차이

1> 분명히 RR 지원 갭 잠금 (다음 키 잠금), RC는 더 갭 잠금이없는 상태. MySQL은 RR 간격 잠금 장치의 필요 때문에 팬텀 읽기의 문제를 해결합니다. RC 격리 수준과는 읽을 수 있으며 반복 할 수없는 팬텀 읽기. 따라서, RC 동시성은 RR에 비해 일반적으로 더 나은;

2> (이것은 "2 단계 잠금 원리"훼손 것이지만) RC 분리 레벨은 조건이 촬영 조건에 라인 잠금을 충족하지 않는 필터를 통과 한 후, 해방 될 것이다 조건 곳을 충족하지 못하는 경우에도, 그러나 RR 분리 레벨을 기록은 행 잠금 및 갭 잠금을 해제하지 않을 것이다; 관점에서 잠금 장치는, RC 동시성이 더 RR 이상이어야한다; 추가 삽입을 t 선택에 ...의에서 테이블 곳의 문 잠금 장치가 동일하지 않습니다.

5. 데이터베이스가 잠겼습니다 검토 및 라인 트랜잭션

두, MySQL은 행 잠금, 테이블 잠금

MyISAM 테이블이 잠긴 테이블을 선택의 경우, 대기 상태에서 다른 운영 중단으로 이어질 것입니다.
InnoDB의 테이블의 테이블을 잠글 수 없습니다 선택합니다. 사실, 여기에 스냅 샷을 사용합니다. 스냅 샷은 여기서 논의하지.

일반적인 이노, 선택 ... 업데이트, + ID 또는 고유 인덱스 필드 필터, 그렇지 않으면 테이블 잠금으로 이어질 것입니다 곳으로 관심을 지불해야합니다.

최적화 팁 :

1. 서버 최적화, 예를 들어, max_connection 큰 변화는 수정 connection_timeout

2. 최적화 클라이언트 연결, 다중 연결 풀

3. 아키텍처 수준입니다.

    1)) 예를 들어, 레디 스 (캐시를 사용.

    2) 산개 성단, 별도의 읽기 및 쓰기가없는 경우.

    3) 클러스터가 느린 또한 얼마나 수백만의 데이터의 양을 가정, 읽기 및 쓰기 분리하더라도, 다음 하위 라이브러리 하위 테이블

4. 구성 slow_query_log는 실행 시간을 분석 오랫동안 설정 SQL뿐만 아니라 특정 속성의 소비를 초과, 통계 분석 도구를 mysqldumpslow 슬로우 쿼리 bin 디렉토리로 사용할 수 있습니다.

SQL 최적화 :

페이징 쿼리가 너무 복잡 경우 1. 당신은 직접 세부 데이터 열을 버스트 지정된 확인 페이지 된 데이터를 확인할 수 있습니다.

2.case 때 문 성능에 미치는 영향이 너무 큰 경우 이전에 작성된하지만 시간 뒤에 곳에서 쓰기에 걸릴 수 있습니다

페이지 번호가 증가함에 따라, 검색 효율이 낮은 한계 탭을 사용하여 대용량의 데이터를 3.mysql.

    제품 한도 10, 20 * 0.016秒에서 선택
    생성물 한도에서 선택 * 100 20 0.016秒
    제품 한계 10000 20 0.094 *로부터 선택秒

    제품의 한계 400000, 20 3.229 SELECT * FROM 秒

   인덱스 테이블의 사용을 커버하는 페이징 쿼리 속도를
   문이 (인덱스를 포함하는)에만 인덱스 열을 포함하는 경우, 우리에게,이 상황 것이다 곧 쿼리를 모두 알고, 인덱스 쿼리의 사용을.

생성물로부터 SELECT * WHERE ID가> = (ID 제한 866,613 의한 상품 주문 번호 선택 1) 한도 20 或者

   생성물로부터 SELECT *가 조인 (ID 제한 866,613하여 제품 주문 선택 이드, 20) = ON B a.ID b.id

   0.2 초 쿼리 시간! 

// 검색 (VTYPE, ID)와 같은 지수를 추가 신속 것이다 VTYPE = 1 개 제한 90000,10 어디에서 수집 ID를 선택

2. 인덱싱 작업

MySQL의 InnoDB하지만 지금 주로 사용되는 인덱스 트리 구조 B +, B + 트리가 절대적으로 균형 트리, 그것은 오른쪽 또는 왼쪽으로 이동 데이터의 특정 부분을 알 필요, 속도, 메인 메모리 및 하드 드라이브 사이의 동작 IO 좋은 감소 될 수있다 쿼리 속도. (케이스 : B가 다중 됨 나무, B 나무, 다양한 데이터이다 리프 노드에 저장되고, 리프 노드는 포인터에 의해 연결되어간에 균형 이진 트리에 해당되지 않지만 균형 트리가 있습니다.)

일반적으로 단 (N 로그) O를 B + 트리, 왜 B + 트리를 선택하는 동안 통용 B + 트리의 저장 구조 MySQL의 인덱스는, 실제로는, 데이터 (1) O 낮은 복잡도를 찾을 해시 구조 기억 해시 구조를 갖는다?

분석 :

1. 왜 이진 트리 아닌가요? 
우리가 디스크 IO의 영향을 고려하기 때문에, 매우 느린 메모리를 기준으로합니다. 인덱스는 디스크에 저장되고, 데이터의 양이 전체 인덱스의 모든 메모리에로드 될 수없는 경우, 그것은 (인덱스 트리의 노드에 대응하는) 하나의 각 디스크 페이지가로드 일 수있다. 우리는 IO의 수를 줄이려 그래서

2. 왜 해시를 사용합니까?

부하 배치에 데이터를 허용 할 수 있습니다 메모리 B + 트리 디자인에로드되면 나무의 낮은 높이, 검색 효율을 향상하면서 데이터베이스에 인덱스가 디스크에 일반적으로, 많은 양의 데이터는 경우되지 않을 수 있습니다.

이 및 관련 비즈니스 시나리오. 당신은 단지 데이터를 선택하는 경우, 그것은 해시 빨리 참이다. 그러나 데이터베이스는 종종 인해 B + 트리 인덱스 질서에,이 시간을 여러 개 선택할 것, 그리고 훨씬 빨리에 자사의 쿼리 효율성 비율 해시 목록을 연결했다.

일반적으로하지에 <>가 null의 인덱스를 복용하지 사람이 아니라 기계적는 B + 트리 인덱스 모르는 사용하고 있기 때문에, 매우 간단 왼쪽이나 트리의 오른쪽에있는 경로에서 어떤 모습 아래에있는 만 할 수있는, 알고 여기에 전체 테이블 검색, 비 효율성, 기본의 공동 인덱스가 이해가 안 더 검증이다.

인덱스 컬럼의 데이터 길이가 너무 깁니다 인덱스의 효율성에 영향을 미칠 것이다, 그러나 실제 이유는 것을 우리 모두가 알고에 밤을 위해?

B + 트리 인덱스 MySQL이 사용하기 때문에 실제로, 모든 데이터는 열 크기의 주 인덱스가 너무 크면 그래서, 결과적으로 너무 많은 수없는 각각의 데이터 저장을위한 리프 노드로 이어질 것이다 리프 노드에 위치 더 잎을 표시,보다 잎이 저 때문에 효율성에, 만일 나무, 깊은 층의 수의 층의 수가 증가하고, 때 사라 횟수도 증가 찾기 IO으로 이어질 것입니다.

 

2. 실행 조정

IDEA 도구는 신속하게 SQL 효율을 찾을 수 XRebel가 너무 낮 추천

테스트

지침 :

TABLENAME에서 확장을 선택 *을 설명;
경고를 보여;

 

사용 지침은 우리가 최적화 할 대상이 될 수있는 문을 선택하는 데 도움 수있는 확장 된 분석을 설명하는 설명합니다.

우리가이 최적화 방법은 SQL 쓰기 볼 수있는 경고를 보여, 그것은 시각적으로 뛰어난 자신의 SQL 여부를 확인할 수 있습니다.

 

다음은 테스트 테이블은 다음과 같습니다

TABLE을 만들`t_stu` (
  `id` INT (11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR (20) 초기 NULL,
  PRIMARY KEY (`id`)
) ENGINE = 이노 AUTO_INCREMENT = 4 = DEFAULT CHARSET UTF8;

 

명령 입력이 확장 XXX의 설명입니다 결과 상위를 :

경고 표시, 명령으로 결과 두 :

결과는 매우 우리가 SQL 자동으로 전체 열 이름을 채우기 쓰기 지우 두를 볼 수 있습니다

해결

그렇다면 그것의 결과를 분석하기 위해?

결과의 요약 :(이 보웬에서 인용 한이 위에서 언급 한 것입니다)

 

그들은 쉽게 오해 할 수있는 몇 가지 팁을 함께했다 :

  1. 일반적으로, 열은 NULL NOT NULL이 얼마나 도움이 성능을 변경하지 않을 수 있습니다,하지만 당신은 열에 인덱스를 생성하려는 경우, 열이 NOT NULL로 설정해야합니다.

  2. 지정없이 계란 등 INT (11)와 같은 폭 정수 유형. 저장 공간 INT 32 비트 (4 바이트)는, 그 범위는 상기 INT. (1)를 나타내는 결정되었으며, INT는 (20 임)에 대해 동일한 계산되고 저장된다.

  3. UNSIGNED이 음수를 표현하기 위해 허용, 약 양수의 상한은 두 배. TINYINT 이러한 스토리지 127 -128 범위이고, 범위 UNSIGNED TINYINT 0을 저장 - 255.

  4. 일반적으로, DECIMAL 데이터 유형을 사용하는 것이 훨씬 필요가 없습니다. 당신이 재무 데이터를 저장해야 할 경우에도, 당신은 여전히 BIGINT를 사용할 수 있습니다. 이러한 백만 정확한 부분에 필요에 따라, 데이터는 백만 승산 될 수 있고, 다음 BIGINT 스토리지를 사용한다. 부동 소수점 연산이 피합니다 소수점 비용이 많이 드는 문제의 정밀하고 정확한 계산하지 않습니다.

  5. 타임 스탬프 저장 공간의 4 바이트를 사용 DATETIME 8은 저장 공간 (바이트). 따라서, 타임 스탬프 만이 표시된 DATETIME 범위보다 작은 경우 1970--2038 년 표현 인해 다른 시간대 및 다른 타임 스탬프 값에있다.

  6. 대부분의 경우에 사용되지 열거 형은 문자열의 단점 열거 목록에 추가 한 경우에만 제거 문자열 (열거 옵션) 단지 추가 요소 목록의 끝에합니다 (ALTER TABLE을 사용해야합니다, 고정 인 필요 ) 테이블을 다시 할 필요가 없습니다.

  7. 스키마 열 너무 많이. 그 이유는 서버 계층 엔진 카피 포맷 데이터 스토리지 엔진 API 작동 버퍼 라인에 의해 메모리 층 사이에 필요한 다음 열로 버퍼 컨텐츠를 디코딩 서버 계층이 변환 처리의 비용이 매우 높다. 너무 많은 열이 거의 열이 실제로 사용하는 경우, 높은 CPU의 원인이 될 수 있습니다.

  8. 대형 테이블 ALTER TABLE은 매우 시간이 많이 걸리는이며, 대부분의 결과 테이블의 수정 작업은 빈 테이블의 시트와 새로운 구조를 만들려면 새 테이블로 이전 테이블에서 모든 데이터를 찾은 다음 이전 테이블을 삭제하는 것입니다 MySQL을 수행한다. 특히 메모리와 테이블이 너무 커서,하지만 여전히 많은 인덱스가있는 경우에, 그것은 더 오래 걸립니다. 물론, 일부 영리이 있지만이 문제를 해결할 수있는 쓸모없는, 자신을 찾아보실 수 있습니다 관심이 있습니다.

인덱싱 기준 

 

위로 테이블 : 이노 쿼리하지 전체 데이터 (인덱스 이노 두 잎에만 인덱스 키 저장 키와 기본 키) 볼 수있는 두 번째 인덱스는 B + 트리의 잎 노드 추가 B의 +를 얻기 위해 기본 키 인덱스입니다 다시 갈 수있는 나무를 찾기이 다시 테이블입니다.

인덱스 취재 : 보조 인덱스 B + 트리에서 인덱스를 위와 동일하지만 질의 열은 보조 인덱스 필드 때문에 예외가, XX에서 보조 인덱스 필드를 선택 인 것은 시간을 찾기 위해, 리프 노드는 원하는 데이터를, 그리고 다시 테이블에 .

 인덱스를 사용할지 여부 MySQL은 비용 기반 옵티마이 저는 기본 토대를 판정한다. 규칙의 일부 다이 세트 라인에 있지 않도록, 지능형 비교.

예를 들어 쿼리 밴드에서,하지 동일하지 않다. 많은 사람들이 있지만, 반드시, 인덱스가 실패로 이어질 것이라고 말한다.

예를 들어, 증가 기본 키 테이블을 가정 테이블에서 선택 * 어디 ID = 1 ;! 지수는 갈 것이다, 최적화 프로그램이이 사건을 찾을 수 있기 때문에, 리프 노드가 정렬되기 때문에 잎 노드 ID = 1을 발견, 그것은 유연하게 판단 할 것이 좋습니다 그래서 그렇게까지 갈 수있는 지표 인 1 일 이후 데이터에 직접 리프 노드를 찾을 수 있습니다.

게시 21 개 원래 기사 · 원 찬양 9 ·은 30000 +를 볼

추천

출처blog.csdn.net/a5552157/article/details/83104922