SQL 문 구 를 최적화 한 JOIN 과 LEFT JOIN 과 Right JOIN 문장의 최적화
3782 단어 sql 구문 최적화LEFT조인 최적화RIGHT
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 에 저장 합 니 다.이것 은 바로 위의 네 번 째 점 을 증명 합 니 다.