2011-12-22 6 views
4

기본 키가 id 인 연락처 테이블이 있습니다. 또한 보조 색인 idx_id_del_user (id, deleted, user_id)가 있습니다.in 절이있는 인덱스가 인덱스를 사용하지 않습니다.

다음 쿼리는 인덱스를 사용하기 때문에 매우 빠르고 - 0.0098s

에서

select id 
from jts_contacts 
where id = '00000402-25c8-7375-e3df-4ec5b66de11d' 
and deleted = 0; 

1 행 페치 내가 절에서 사용하는 경우에는 외부 쿼리가 전체 테이블 스캔에 간다. 기본 키 또는 idx_id_del_user 중 하나를 사용하려고합니다. 9S

에서 가져온

select * 
from jts_contacts FORCE INDEX (idx_id_del_user) 
where id in 
(select id 
from jts_contacts 
where id = '00000402-25c8-7375-e3df-4ec5b66de11d') 
and deleted = 0 

1 행 계획을 설명 -

id, select_type,   table,   type, possible_keys,     key, key_len, ref, rows, Extra 
------------------------------------------------------------------------------------ 
1, 'PRIMARY',   'jts_contacts', 'ALL', '',       '', '',  '', 1127275, 'Using where' 
2, 'DEPENDENT SUBQUERY', 'jts_contacts', 'const', 'PRIMARY,idx_id_del_user', 'PRIMARY', '108', 'const', 1, 'Using index' 

이 표는 120 만 개 기록을 가지고 있으며, 테이블 분석 하였다. FORCE INDEX 옵션없이 시도했지만 인덱스를 사용하고 있지 않습니다. 이 쿼리를 더 빠르게 만드는 방법에 대한 제안 사항은 무엇입니까?


경고 : 조인을 대신 절에이은 기존 제품에서 생성 된 쿼리입니다 그러나 때문에, 작동 사용 -이 조인 사용 변경할 수 없습니다.

답변

2

내가 알 수있는 바로는 IN은 일치하는 레코드를 모두 거쳐 한 번에 한 행씩 절의 값과 비교합니다.

따라서 가장 좋은 방법은 deleted에 색인을 사용하는 것입니다. 그러면 deleted = 0 인 레코드 만 통과하게됩니다.

+0

감사합니다. 나는 그것을 또한 시험해 보았다. 그러나 삭제 된 것은 두 개의 0과 1 (매우 선택적은 아닙니다)입니다. 실제로 응답 시간은 12 초로 늘어납니다. 나는 대답에 동의하지만 삭제 된 색인은 매우 선택 적이기 때문에 작동하지 않습니다. – user1112552

0

방금 ​​같은 문제가 있었는데 Marcus Adams의 게시물을 읽은 후 동일한 테이블의 데이터를 기반으로 테이블에서 UPDATE를 실행하여 배웠던 것을 생각해 냈습니다. 첫째,이 같은 테이블 :

SELECT * FROM jts_contacts WHERE id IN 
(SELECT id FROM 
    (SELECT id FROM jts_contacts WHERE id = '00000402-25c8-7375-e3df-4ec5b66de11d') 
temp) 
AND deleted = 0 

이 먼저 파생 temp 테이블에 내부 쿼리에서 전체 결과를 가져오고 그 기반으로 외부 쿼리를 실행합니다.

이 패턴은 비슷한 쿼리의 속도를 몇 분에서 1 초 미만으로 향상 시켰습니다. 나는 너를 괴롭힌다.

관련 문제