2011-08-09 4 views
7

그래서 항상 Extra 열의 "Where Using"를 보는 것이 좋습니다. 그러나, 나는 EXPLAIN intepreting에 나의 동료에 대한 갈색 점심 도시락을 계획하고 있었고, 지금 나는 그렇게 확신하지 않는다. MySQL의 문서는 "Where Using"에 대한 주석에서 다음과 같이 설명합니다 :MySQL 최적화 : EXPLAIN "Extra"열에 "Where Using"이 포함되어 있습니다.

WHERE 절은 다음 테이블과 일치 시키거나 클라이언트에게 보낼 행을 제한하는 데 사용됩니다. 테이블에서 모든 행을 가져 오거나 조사하려는 경우가 아니라면 Extra 값이 Where를 사용하지 않고 테이블 조인 유형이 ALL 또는 index 인 경우 쿼리에 잘못된 것이있을 수 있습니다. WHERE 절의 모든 부분에 대해 인덱스를 사용하더라도 열이 NULL 일 수있는 경우 Where using을 볼 수 있습니다.

이 있음을 믿고 날 리드 경우에도 내 절은 열이 NULL 값을 가질 수 있다면 MySQL이 여전히 행을 검토 것, 인덱스의 일부를 포함하고 있습니다.

사실입니까? 그렇다면 필요하지 않으면 NULL을 포함하지 않도록 열을 변경해야합니까? 나는 속도 향상을 볼 것인가?

+0

방금 ​​테스트를 마쳤습니다. 열을 null에서 null로 변경 한 다음 "using using where"이 사라졌습니다. – tomwang1013

답변

5

null 조건을 검사해야하기 때문에 Nullable 열에는 오버 헤드가 있습니다. 열이 null 일 필요가 없거나 요구 사항이 null을 허용하지 않으면 열을 분명히 not null으로 만듭니다.

색인의 경우 색인 구성에 따라 다릅니다. 색인이 (a,b,c)으로 정의되고 where 절에 b,c을 사용하는 경우 a이 재생 중이므로이 색인을 사용할 수 없습니다.

+0

안녕하세요, @Marc, 답장을 보내 주셔서 감사합니다. 다중 파트 인덱스가 작동하는 방식을 이해합니다. 나는 내가 묻는 것 같아요 : 인덱스 (a, b, c)와 "a, b, c = 같은 테이블에서 select a, b, c"와 같은 쿼리를 가진 테이블이 있다면? c 열은 null입니다. MySQL은 여전히 ​​각 행을 검사해야합니까, 아니면 인덱스가 쿼리를 완전히 해석합니까? –

+0

a/b를 기반으로 부분적으로 필터링 할 수 있지만 null을 확인하기 위해 C로 추가 작업을해야합니다. 인덱스가없는 것보다 효율적입니다. 그러나 세 컬럼 모두가 널이 아닌 경우에는 효율적이지 않습니다. –