database

[MYSQL] - SELECT 효율적으로 사용하기 - JOIN(2)

sewonzzang123 2022. 1. 3.
반응형

https://sewonzzang.tistory.com/10

 

[MYSQL] - SELECT 효율적으로 사용하기 - JOIN

1. 쿼리의 속도를 측정하는 EXPLAIN mysql 옵티마이저는 비용 기반으로 어떤 실행 계획으로 쿼리를 실행했을 때 비용이 얼마나 발생하는지를 계산하여 비용이 가장 적은 것을 택하게 된다. 어디까지

sewonzzang.tistory.com

2. JOIN 쿼리의 최적화

 

A,B,C테이블을 가정할 떄,

A와 C를 JOIN 한다면,

select * from A left join C on A.A_ID=C.A_ID

로 하게 된다면 ALL 이 될 것이다.

왜냐하면 A 테이블은 C에 없는 A_ID 행들을 가지고 있기 때문이다.

A 기준으로 찾는다고 생각을 해 보면, A테이블을 다 뒤져보게 되는 것이다.

그래서, 반대로 조회를 해야 한다.

select * from C left join A on C.A_ID = A.A_ID

더구나 C 테이블의 C.A_ID는 인덱스까지 잡혀있다.

EXPLAIN으로 나온 type 중에 index로 나와도 ALL 다음으로 최악이지만 ALL 보다는 훨씬 빠르다. (using temporary...등등이 없어진다.)

3 테이블을 모두 join 하려면 다음과 같을 것이다.

 

SELECT A.*,B.*,C.*
FROM C
LEFT JOIN A ON A.A_ID = C.A_ID
LEFT JOIN B ON B.B_ID = C.B_ID

3. STRAIGHT_JOIN

MYSQL에서 내부적으로 JOIN 순서를 바꿔 실행하는 경우가 있다. 이 때 EXPLAIN에서는 type 이 ALL으로 나옴.

그래서 명시된 순서대로 JOIN을 시키려면 STRAIGHT_JOIN을 사용해야 한다.

 

SELECT STRAIGHT_JOIN A.*,B.*,C.*
FROM C
LEFT JOIN A ON A.A_ID = C.A_ID
LEFT JOIN B ON B.B_ID = C.B_ID

 

2022.02.19 - [database] - [SQL] 조인 JOIN ( INNER, OUTER, CROSS)

 

반응형

댓글