테스트 사이트 - 개발 중인 베타 버전입니다

g5_member 테이블 인덱스 질문 채택완료

와칸다포에버 2년 전 조회 2,944

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

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

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

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

해결 방법이 있을까요?

댓글을 작성하려면 로그인이 필요합니다.

답변 5개

복스리
2년 전

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

 

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

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

 

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

2년 전

friends_table 의 send_mb_id, recv_mb_id 인덱스 지정

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

Or를 일단 빼세요.

로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

엑스엠엘
2년 전
{$this->tables->friends_table}
에 인덱스가 적당하지 않으면
이 테이블부터 드라이브 합니다
엑스엠엘
2년 전
Show index from
FROM {$this->tables->friends_table}
Show index from g5_member
결과를 올려 보세요

댓글을 작성하려면 로그인이 필요합니다.

웅푸
2년 전

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

로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

와칸다포에버
2년 전
아무런 변화가 없습니다..ㅜㅜ
웅프
2년 전
인덱스도 재등록 해보시구요 ;;

댓글을 작성하려면 로그인이 필요합니다.

2년 전

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

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

- 조인 전체 쿼리문

 

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

로그인 후 평가할 수 있습니다

답변에 대한 댓글 2개

와칸다포에버
2년 전
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) 와 나머지 쿼리문 구조와 같습니다.
배르만
2년 전
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 을 확인해 보는 방법도
자체적 문제해결에 도움이 되지 않을까 싶습니다.

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인