g5_member 테이블 인덱스 질문

g5_member 테이블 인덱스 질문

QA

g5_member 테이블 인덱스 질문

답변 5

본문

g5_member 테이블 mb_id 필드에 인덱스를 지정하고 다른 데이터베이스 테이블과 left join을 했습니다.

속도가 느려서 EXPLAIN로 결과를 확인해보았는데, g5_member mb_id 필드에 인덱스를 지정했음에도

possible_keys과 key가 NULL로 나오고 풀스캔이 발생합니다 ㅜㅜ

테이블 최적화도 해봤고, 데이터도 지웠다가 다시 해보았는데도 안되네요..

해결 방법이 있을까요?

이 질문에 댓글 쓰기 :

답변 5

- 조인에 사용되는 각 테이블 구조

- 조인에 사용되는 각 테이블의 대략적인 row 수

- 조인 전체 쿼리문

 

등의 정보가 어느정도 제공되어야 문제해결에 도움이 되지 않을까 싶습니다.

SELECT a.idx, a.send_mb_id, a.recv_mb_id,
      b.mb_nick AS send_mb_nick, b.mb_level AS send_mb_level,
      c.mb_nick AS recv_mb_nick, c.mb_level AS recv_mb_level
FROM {$this->tables->friends_table} a
INNER JOIN {$maindb_name}.g5_member b
    ON (a.send_mb_id = b.mb_id)
INNER JOIN {$maindb_name}.g5_member c
    ON (a.recv_mb_id = c.mb_id)
WHERE (a.send_mb_id = :mb_id OR a.recv_mb_id = :mb_id)
LIMIT 20

쿼리는 이렇게 작성 되어 있고, g5_member 테이블과 friends테이블 각 3천개정도의 데이터가 있습니다.
friends테이블에는 send_mb_id, recv_mb_id 각 필드에 인덱스를 줬고, EXPLAIN을 했을땐 possible_keys에 각 키가 잘 들어가 있습니다. friends 테이블 구조는 idx(primary key) 와 나머지 쿼리문 구조와 같습니다.

friends 테이블 구조가 쿼리에 쓰여진 컬럼처럼
a.idx, a.send_mb_id, a.recv_mb_id
3개의 컬럼만 존재한다는 건가요?
그렇다고 해도 인덱스 정보가 필요하고
구조를 제공하면 인덱스 정보도 포함되기 때문에
다시 질문하고 다시 답변하는 시간비용을 줄이고자 구조가 필요하다고 한 것입니다.

g5_member 테이블의 구조는
https://github.com/gnuboard/gnuboard5/blob/master/install/gnuboard5.sql
에서 확인할수 있습니다만

혹시나 커스텀이 되어 있다면 이것 역시 별도로 구조가 제공되어야 하고
friends 테이블도 확인할 방법이 없기 때문에 역시 구조가 제공되어야 합니다.

쿼리도 php 에서 사용되는 변수및 바인딩 구문이 섞인 상태인데
복잡성 여부를 떠나 완전하게 해석된 쿼리가 아니면 제3자는 그것을 유추해야 합니다.

friends 테이블의 구조가 제공되지 않았기 때문에 현재 상태에서는
쿼리에 사용된 a.send_mb_id, a.recv_mb_id 컬럼에 인덱스가 없어서 그런 현상이 발생하는건 아닐까 추측해봅니다.

추가로 완전하게 해석된 쿼리로 EXPLAIN 을 확인해 보는 방법도
자체적 문제해결에 도움이 되지 않을까 싶습니다.

ANALYZE TABLE g5_member; 업데이트 한번해보세요

Or를 일단 빼세요.

pk 쪽에다 index를 지정해보시기 바랍니다.

 

left join은 어떤 이유에서 사용했는지는 잘 모르겠는데요.  만일 left join을 사용해서 관련된 값을가지고 오게 하실려면 차라리 function올 만들어서 해당 필드를 호출해서 select해보시면 속도가 보다 개선될겁니다.

데이터 양이 많은경우 join을 자주 쓰번 perfermance가 떨어지기 때문입니다.

 

답변을 작성하시기 전에 로그인 해주세요.
QA 내용 검색
질문등록
전체 1,543
© SIRSOFT
현재 페이지 제일 처음으로