[MySQL] select_full_join 줄이기
(1) 테이블에 찾아보기 넣기
select_full_join 값은 찾아보기(인덱스, index)를 참조하지 못하고 이어붙이기(join)를 하는 때에 올라간다. SQL 문장을 실행할 때에 찾아보기를 참조할 수 있도록 테이블에 찾아보기를 넣는다. 때때로 둘 이상의 열(컬럼, column)을 얽은 찾아보기가 필요할 수도 있다.
아래는 이름이 'db_name'인 데이터베이스(자료기지)의 이름이 'table_name'인 테이블에 'id' 열과 'nickname' 열에 대한 찾아보기 'idx_id'를 넣는 SQL 명령문이다.
ALTER TABLE `db_name`.`table_name` ADD INDEX `idx_id_nickname` (`id`, `nickname`);
(2) 찾아보기를 참조하도록 SQL 문장 고치기
이어붙이기(join)를 할 때 참조할 수 있는 찾아보기가 테이블에 잘 들어 있더라도, 찾아보기를 잘 쓰지 못하는 실행하게 만들어진 SQL 명령문이 실행되면 select_full_join 값이 올라갈 수 있다
MySQL의 일반 로그 기능과 EXPLAIN 명령을 이용해서 문제가 있는 SQL 문장을 찾이 파헤칠 수 있다.
① SELECT 문에서 얻을 자료를 아무개 문자로 지정하는 것을 피한다.
SQL에서 "SELECT * FROM 테이블"처럼 별표(*) 같은 아무개 문자(와일드카드 문자)를 쓰면 특정 테이블의 열을 한꺼번에 모두 뽑아낼 수 있다. 하지만 아무개 문자를 쓰는 것이 select_full_join 값이 올라가는 까닭이 되기도 한다.
"SELECT id, name, nickname, ... FROM 테이블"처럼 얻으려는 정보가 있는 열만 세세하게 적어 주면, SELECT 문에 아무개 문자를 쓰는 것 때문에 select_full_join 값이 올라가는 일을 줄일 수 있다.
② 'ORDER BY RAND()'나 'GROUP BY'를 피하거나 적절히 이용한다.
'ORDER BY RAND()'나 'GROUP BY'는 임시 테이블을 만드는 때나 select_full_join 값을 늘리는 까닭이 되기도 한다. 꼭 필요한 때가 아니면 둘을 쓰는 때는 적을수록 처리 시간이 짧아질 것으로 볼 수 있다.
다만 요령을 잘 부린다면 이야기가 달라질 수 있다. 으뜸 열쇠값(PRIMARY KEY)으로 삼아서 이미 차례짓기가 된 열은 'GROUP BY'를 쓰는 것이 나쁘지 않을 수 있다. 'ORDER BY RAND()'를 쓰면 찾아보기를 쓰지 못하는 것이 맞지만, 테이블에 따로 난수가 들어가는 열을 올려 'ORDER BY RAND()'를 쓰면서도 찾아보기를 쓰게 하는 방법도 있다. (참고: [MySql] ORDER BY RAND() 튜닝)
(3) 테이블 최적화
찾아보기를 잘 넣고 SQL 문장을 잘 고쳤어도 select_full_join 값이 올라간다면, 데이터베이스에 들어간 테이블 구조가 어긋나 있기 때문일 수 있다. 그런 때에는 테이블을 다시 만들거나 OPTIMIZE 명령으로 테이블 구조를 최적화해 준다.
테이블 이름이 'table_name'인 테이블을 아래와 같은 OPTIMIZE 명령으로 구조를 다시 만들 수 있다.
mysql> OPTIMIZE table `table_name`;
아래 그림처럼 phpMyAdmin에서 여러 테이블들을 한꺼번에 최적화할 수도 있다.
덧글을 달아 주세요