데이터베이스 색인 및 SQL 처리의 최적화

먼저 데이터베이스 서버에서 SQL 문의 과정을 이해해야합니다, 좋은 인덱스를 설계 원,이 문서에서는 데이터베이스 인덱스 설계 및 최적화 인덱스에 대한 매우 중요한 개념입니다 몇 가지 최적화를.

술부

술어는 조건식입니다. 어디 하나 개 이상의 조건에 의한 SQL 문 절.

WHERE SEX = 'M' 
        AND 
        (WHIGHT> 90 
        OR 
        HEIGHT> 190)

위의 세 가지 간단한 WHERE 절 조건 :

  • SEX = 'M'
  • WRIGHT> (90)
  • HEIGHT> 190

또한 두 술어의 조합으로 고려 될 수있다 :

  • WEIGHT> 90 HEIGHT> 190
  • SEX = 'M'AND (WEIGHT> 90 HEIGHT> 190)

 

최적화 및 접근 경로

관계형 데이터베이스의 장점 중 하나는 사용자가 데이터의 관계에 대한 액세스 권한이없는 것입니다. 즉, DBMS의 구성 요소 인 액세스 경로 최적화가 결정된다. SQL 최적화 프로세스의 핵심이다 .

다음 예는 간단한 MySQL의 MySQL 서버 논리 구조를 나타낸

그림에서 우리는 최적화의 위치를 ​​볼 수 있습니다.

 

SQL 문이 실제로 실행되도록하기 전에, 최적화 알고리즘은 먼저 데이터에 액세스하는 방법을 결정해야합니다. 같은 MySQL은 쿼리를 구문 분석하고 구문 분석 트리를 만든 다음 테이블의 읽기 순서를 결정하기 위해 올바른 인덱스를 선택하는 결정을 포함하여, 다양한 최적화를 실시 할 수 있습니다.

조건식은 인덱스의 설계를위한 주요 출발점입니다. 인덱스 모든 술어 표현을 SELECT 쿼리를 충족하는 경우, 최적화는 효율적인 액세스 경로를 구축 할 가능성이 높다.

 

인덱스 치열하고

술어 표현이있는 경우 B + 트리의 형태로 조직 할 때 색인, 만약 WHERE A > 100 AND A < 110, 범위의 리프 노드에 쿼리가 결국 아래 그림 것입니다 :

 

인덱스의 좁은 부분은 그림입니다 왼쪽, 우리는이 세그먼트 전화 인덱스 시트를 . 이 단편을 순차적으로 스캔 할 테이블로부터 판독 110-100 사이에서 상기 값 (버퍼 풀에서 가능하고), 판독 동기하여 해당 테이블 행의 행 인덱스.

따라서, 접속 경로의 비용이 크게 조건식 결정된 범위 인덱스 시트의 두께에 따라 달라진다. 인덱스 두꺼운, 더 많은 인덱스 페이지를 스캔 할, 치료를 필요로 더 많은 인덱스 기록하지만, 가장 큰 비용이 테이블에 동기 읽기 작업에서 증가, 각 페이지 테이블은 I에게 읽기 / O 작업은 10ms의이 걸릴 수 있습니다. 따라서, 지수 시트는 비교적 좁고, 상기 동기화 테이블의 판독을 감소시킬 것이다.

 

인덱스 필터 여과 칼럼

모든 인덱스 열은 인덱스의 크기를 정의 할 수있는 것은 아닙니다. 때로는 WHERE 절에, 또한 인덱스에 존재하는 두 열이있을 수 있지만 열은 예를 들어, 인덱스의 정의에 참여할 수 없습니다. 테이블, 다음 SQL 문에 대한 공동 색인 (A, B, C, D)

WHERE A =하십시오 
        AND 
        B> : B 
        C = C

우리는 WHERE 절 술어는 인덱스의 크기를 결정할지 여부를 결정해야합니다 :

  1. 먼저 우리가 WHERE 절에 보면, 열이 적어도이 간단한 충분 조건은 해당? 그렇다면,이 열은 열을 일치하는 것입니다. 하지 않으면, 다시 행과 열 인덱스는 타의 추종을 불허하는 열입니다.
  2. 술어 술어 범위이면, 나머지 비 매칭 인덱스 열은 열이다.
  3. 술어 이에 열로 그 필터에 대응하는 경우 마지막 치열 후 열의 인덱스를 들어, 충분히 간단한 갖는다. 이 방법에 의하면, 우리는 윤곽을 따라서 A 열에 일치하는 열을 충분히 간단한 술어 술어에 나타나는 결정할 수, 칼럼 B는 열에 일치 범위 술어이다. C 컬럼 인덱스 B의 후면을 정의 할 수없는 상태 (인덱스 좁아 허용되지 않음)하지만, 여전히 지수 필터링 프로세스에 참여할 수있다. 즉, 우리는 열 A 및 열 B, C 및 열하지만 테이블에 액세스하기 전에, 필터는 여전히 열 C로 기록 될 수있다되지 통해 인덱스 시트의 크기를 정의하고, 불필요한 액세스 테이블을 삭감 할 수있다. 열 C가 속한 여과 열을 그냥 열 B. 중요하고 열 같다,

요약 :

절 상기 두 개의 열, 열 A 및 열 B와 일치하는 경우, 스캔 인덱스를 정의한다. 필터 열로 열 이외에 C. 동시에 라인이 세 가지 조건을 충족하는 경우에만 그래서 당신은 테이블의 데이터에 액세스합니다.

조건식 동등한 술어 칼럼 B 인 경우, 세 개의 열은 치열로서 사용될 수있다.

열 제거 술어 식은 다음 인덱스 단편은 전체 인덱스의 크기 인 경우, B 및 C 컬럼은 단순히만을 필터링하는 데 사용된다.

 

필터 요소

필터 술어 선택성 바와 행 계수의 개수의 비율, 즉, 주로 열 값의 분포에 따라 점유 술어 조건 테이블을 만족시킨다.

필터 요소는 다음과 같이 계산된다 :

结果集数量/表行的数量

예를 들어, 사용자의 성별리스트 여성 사용자를 추가하는이 분야, 성별 =가 'F'의 필터 계수가 더 클 것이다.

만약 테이블의 남성의 70 %, 다음 SEX = 'M'필터 계수는 70 %, 성별 = 'F'의 필터 계수는 30 %, 70 %의 최악의 SEX 열 여과 계수 평균 필터 요인 50 %.

다음 필터 요소가 SEX 최악의 경우 평균 필터 인수에 나열된 하나 여성 비율 일에 남성은 50 % 인 경우.

 

 

최악의 경우와 최악의 관련 입력이이 조건에 해당 입력이 특정 인덱스를 기반으로 쿼리가 최대 소비하기 때문에 우리는 최악의 경우 필터 계수가 평균 필터 요소보다 더 중요 지표의 적합성을 평가 시간입니다.

 

술어에 대한 조합 필터 요소

그럼 우리가 어떻게의 트리오 술어 표현 필터 계수를 계산?

조건의 경우 열 무관 다음 조건의 술어에 대한 필터 계수의 조합을 하나의 필터 계수로부터 유도 될 수있다.

서로 독립적으로 두 조건의 비 관련 평균값, 예를 들어, 때문에 우리는 그 도시의 값은 반드시이이 두 술어와 관련이있는 "지방"과 "도시"두 개의 필드를 가진 사용자 테이블을 가지고 있고, 여기서 도시를 저장합니다. 도시와 BD (생일)는 술어 관련이 없습니다.

이러한 조합 술어 CITY = :CITY AND BD = :BD술어 동일한 필터 계수 CITY = :CITY와 술어 BD = :BD필터의 곱셈 인자.

열시 2,000 상이한 값 경우 열 BD 2,700 상이한 값은 다음 조합 술어 필터 계수이다 1/2000*1/2700. 이어서 열 [시티, BD] 540 만 개 상이한 값의 전체 조합.

목록 관련성의 경우, 값은이보다 훨씬 작아집니다.

우리는 색인 구조, 필터 계수를 평가하기 위해 전체로 볼 술어의 SQL 문을 결합 할 필요성을 디자인합니다.

 

인덱스 필터 설계에 대한 요인

물론, 영향의 액세스 경로의 성능의 인덱스를 스캔 할 필요의 크기는 필수적이다. 인덱스 중 작은 스크린, 상기 필터 계수가 작을는 덜 자주 테이블에 대한 액세스를 의미한다.

테이블이 공동 인덱스가 가정 (MAKE, MODEL, YEAR)

SQL 문을의 경우 :

SELECT 가격, 색상, DEALERNO 
CAR FROM 
WHERE MAKE은 = MAKE 
        MODEL = 모델의 
ORDER 가격

확인하고 일치하는 열은 모델입니다. 조합 술어 필터 계수가 0.1 %였다 경우 인덱스의 크기는 0.1 %의 전체 인덱스에 액세스해야합니다.

 

인덱스가 좋지 않은 것으로 다음과 같은 SQL 문을 들어 :
SELECT PRICE, COLOR, DEALERNO
FROM AUTO
WHERE   MAKE = :MAKE
        AND
        YEAR = :YEAR

由于联合索引的最左匹配原则,匹配列只有MAKE。过滤因子为1%,索引片比较大。

 

sql语句:

SELECT LNAME, FNAME, CNO
FROM CUST
WHERE   SEX='M'
        AND
        (WEIGHT > 90
        OR
        HEIGHT > 190)
ORDER BY LNAME, FNAME

这个SQL语句查找身材高大有一定要求的男性,此时匹配谓词只有一个SEX,过滤因子正常情况下为50%,如果表有100万行记录,那么索引片就有50万行,这就是相当厚的索引片了。

 

练习

思考一下为以下两个SQL语句设计最佳的索引

SELECT LNAME, FNAME, CNO
FROM CUST
WHERE   SEX = 'M'
        AND
        HEIGHT > 190
ORDER BY LNAME, FNAME
SELECT LNAME, FNAME, CNO
FROM CUST
WHERE   SEX = 'M'
        AND
        (WHIGHT > 90
        OR
        HEIGHT > 190)
ORDER BY LNAME, FNAME

추천

출처www.cnblogs.com/yuanrw/p/11373975.html