SQL 문 구 를 최적화 한 JOIN 과 LEFT JOIN 과 Right JOIN 문장의 최적화

데이터 베 이 스 를 응용 할 때 우 리 는 항상 데이터 베 이 스 를 다 중 표 조회 해 야 한다.그러나 데이터 양 이 매우 많 을 때 다 중 표 조 회 는 실행 효율 에 매우 큰 영향 을 미 칠 수 있 기 때문에 우 리 는 JOIN 과 LEFT JOIN 과 Right JOIN 문 구 를 사용 할 때 특히 주의해 야 한다.
SQL 문장의 join 원리:
데이터베이스 에 있 는 join 작업 은 실제 적 으로 하나의 시계 와 다른 시계 에 대한 연결 입 니 다.많은 오 류 는 이 두 개의 시 계 를 디 칼 로 쌓 은 다음 에 메모리 에 버 리 고 where 와 having 조건 으로 천천히 선별 하 는 것 으로 이해 합 니 다.사실은 데이터 베 이 스 는 그렇게 멍청 하지 않 습 니 다.그러면 대량의 메모 리 를 차지 하고 효율 이 높 지 않 습 니 다.예 를 들 어...우리 가 필요 로 하 는 표 의 일부 줄 과 다른 표 의 일부 줄 만 있 습 니 다.만약 에 모든 표 가 디 칼 로 쌓 이면 비용 도 너무 많이 듭 니 다.진정한 방법 은 모든 표 의 조건 에 따라 하나의 표를 옮 겨 다 니 는 동시에 다른 표를 옮 겨 다 니 며 마지막 조건 을 만족 시 키 는 것 을 찾 은 후에 클 라 이언 트 에 보 내 고 마지막 데 이 터 를 모두 찾 을 때 까지 포 함 된 순환 조회 라 고 합 니 다.
1.레프 트 존 과 라이트 존 최적화
MySQL 에서 A LEFT JOIN B join조건 은 다음 과 같 습 니 다.
1.표 B 의존 과 표 A 및 모든 A 의존 표
2.표 A 는 모든 시계 에 의존 하고 LEFT JOIN 의 시계(B)를 제외 합 니 다.
3、join_condition 은 표 B 를 읽 는 방법 을 결 정 했 습 니 다.where 조건 은 B 에 게 쓸모 가 없습니다.
4.표준 where 와 LEFT JOIN 이 공동으로 최적화
5.A 의 한 줄 이 where 와 having 조건 을 만족 시 키 면 B 에 없 으 면 null 로 채 워 집 니 다.
라이트 존 은 레프 트 존 과 유사 하 며,이 자 리 는 서로 바 꿀 수 있다.
LEFT JOIN 과 정상 JOIN 간 의 전환 은 원칙적으로 where 조건 에 속 고 생 성 된 null 줄 이 false 로 되 돌아 갈 때 정상 적 인 join 으로 직접 전환 할 수 있 습 니 다.
예:

SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;
다음 으로 변 환 됩 니 다:

SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;
주:조건 t2.column 2 가 설정 되 어 있 기 때문에=  5.그러면 모든 생 성 된 t2 가 null 인 줄 은 성립 되 지 않 습 니 다.
이러한 최 적 화 는 매우 빠 를 것 이다.왜냐하면 이것 은 외부 연결 을 등가 연결 로 전환 하 는 것 과 같 기 때문에 많은 줄 의 스 캔 과 판단 이 줄 어 들 었 다.
끼 워 넣 기 순환 조인 알고리즘----Neted-Loop Join
간단 한 끼 워 넣 기 순환 알고리즘 은 하나의 표 에서 시작 하여 표 의 조건 을 통 해 한 줄 을 찾 은 다음 표 의 데 이 터 를 찾 고 찾 은 후에 첫 번 째 표 로 돌아 가 조건 을 만족 시 키 는 줄 을 찾 는 것 입 니 다.
예 를 들 어 세 개의 표 t1,t2,t3 가 있 는데 그들의 join 유형 은 다음 과 같다.

Table  Join Type
t1   range
t2   ref
t3   ALL
최종 생 성 된 위조 코드 는

for each row in t1 matching range { 
 for each row in t2 matching reference key { 
  for each row in t3 { 
   if row satisfies join conditions, 
     send to client 
  } 
 } 
} 
즉,t1 표 는 범위 스 캔 을 통 해 t2 관련 t1,t3 는 전체 표 스 캔 이다.
주:t1 표 의 조건 범위 에 따라 한 줄 을 찾 고 t2 와 일치 하 는 다음 t3 의 만족 조건 을 찾 는 줄
블록 끼 워 넣 기 순환 조인 알고리즘---Block Nested-Loop Join
이 알고리즘 은 기 존의 끼 워 넣 기 알고리즘 이 표 의 한 줄 을 읽 을 때마다 다음 표를 읽 기 때문에 내부 표 는 여러 번 읽 히 기 때문에 데이터 베 이 스 는 join 캐 시(join buffer)를 이용 하여 중간 결 과 를 저장 한 다음 내부 표를 읽 을 때 한 줄 을 찾 으 면 이 캐 시 에 있 는 데이터 와 비교 하여 효율 을 높 인 다.예 를 들 어 한 번 에 겉모습 에서 10 줄 을 읽 고 내부 표를 읽 을 때 이 10 줄 의 데이터 와 비교한다.
MySQL 에서 join buffer 를 사용 하 는 조건 은 다음 과 같 습 니 다.
1、join_buffer_size 시스템 변 수 는 join 마다 사용 하 는 buffer 크기 를 결정 합 니 다.
2.join 형식 이 index 또는 all 일 때 join buffer 를 사용 할 수 있 습 니 다.
3.모든 join 은 하나의 join buffer 를 분배 합 니 다.즉,하나의 sql 은 여러 개의 join buffer 를 사용 할 수 있 습 니 다.
4.join buffer 는 첫 번 째 비상 계량 표 에 배정 되 지 않 습 니 다.
5.인용 할 열 만 join buffer 에 들 어 갑 니 다.전체 줄 이 아 닙 니 다.
마지막 으로 의사 코드 생 성:

for each row in t1 matching range { 
 for each row in t2 matching reference key { 
  store used columns from t1, t2 in join buffer 
       t1 t2      join buffer  
    if buffer is full { 
   for each row in t3 { 
    for each t1, t2 combination in join buffer { 
     if row satisfies join conditions, 
     send to client 
    } 
   } 
   empty buffer 
  } 
 } 
} 
 
if buffer is not empty { 
 for each row in t3 { 
  for each t1, t2 combination in join buffer { 
   if row satisfies join conditions, 
   send to client 
  } 
 } 
} 
주:두 번 째 순환 에서 야 데 이 터 를 join buffer 에 저장 합 니 다.이것 은 바로 위의 네 번 째 점 을 증명 합 니 다.

좋은 웹페이지 즐겨찾기