2011-05-02 7 views
1

성능이 더 빠른 것은 어느 것입니까?SQL WHERE 절의 IN 대 LIKE 선택

SELECT field1, field2, field3, field4 
FROM MyTable 
WHERE field5 IN ('AAL', 'IAL') 

또는 어떤 차이가되지 않습니다 대

SELECT field1, field2, field3, field4 
FROM MyTable 
WHERE field5 LIKE '%AL' 

?

+4

당신이 자신을 위해 그것을 시도하고 봤어? 일반적으로 중요하지 않지만, LIKE는 단순한 동등 테스트가 아니므로 느려질 것입니다. –

+0

"너도 해봤 니?" – MatBailie

답변

6

귀하의 마일리지는 다를 수 있지만 전체 인덱스 스캔 대 2 인덱스 백업 조회이므로 두 번째 속도는 더 빨라야합니다. 필드 5에 대한 인덱스가 없으면 두 테이블 모두에서 전체 테이블 스캔이 중요하지 않습니다.

+0

-1. 필드가 인덱싱 된 것으로 가정하고 있지만 해당 필드가 있는지 여부는 질문에 표시되지 않습니다. 대답은 근거가 없다. – casperOne

+3

@casperOne : 그는 그런 가정을하지 않습니다. 인덱스없이 전체 테이블 스캔이 필요하므로 성능이 동일 할 것이라는 점을 밝히면이 두 가지 시나리오 (인덱스의 사용 여부에 관계없이)를 다룰 수 있습니다. – MatBailie

+0

@Dems : 나는 그것을 볼 수있다. 그러나 나는 그 표현이 매우 오도 된 것이라고 생각한다. 그것은 사실을 바로 잡는다. – casperOne

0

플랫폼에서 확실히 테스트 할 것입니다. 일부 RDBMS는 IN 논리에서 끔찍한데, 예상보다 훨씬 느립니다. MySQL은이 문제가, 귀하의 질문에 지정하지 마십시오. , 위에서 사실이다 마틴 코멘트 당으로서 더있을 때 : 명시된 기타로

+0

정말요? 대부분의 SQL (SQL을 "관계형"이라고 부르지 말라 :)은 단순히 IN 절을'(field5 = 'AAL'또는 field5 = 'IAL')'로 확장하고, 선택한 SQL 제품이 그렇다면 이제는 새로운 것을 찾아야 할 때입니다! – onedaywhen

0

는 MS SQL을 사용하는 경우

UPDATE, 두 문은 성능면에서 동일하지 RDBMS의 선택에 따라 달라집니다 질문에 대한 원래의 가정이었던 field5에 대한 색인이 있습니다.

+0

-1 이것은 사실이 아닙니다. 'field5'와 인덱스 스캔을 비교할 가능성이있는 인덱스가 2 개 있습니다. –

+0

@Martin, 'field5'에 색인이있는 경우에만 맞습니다. 여기에는 토론의 일부가 아닙니다. 색인이 없기 때문에 내 대답이 100 % 정확합니다. 직접 테스트 해보십시오. –

+1

왜 색인이 없다고 가정하는거야? 이 열의 쿼리 유형이 실행될 경우이 열에 인덱스가 있어야합니다. –

4

커버 인덱스 (또는 적어도 필드 5의 인덱스)가없는 경우 둘 다 테이블 스캔이 필요하므로 똑같이 열악합니다.

검색어 정보 ... 두 번째 것은 WHERE field5 = 'AAL' OR field5 = 'IAL'과 동일하며 2 개의 정확한 값을 찾습니다 (예 : 검색 가능성이 높음). 좋아하는 와일드 카드는 "찾기 위해 얼마나 많은 가치가 있을지 모르겠다"는 의미입니다. 찾기가 결코 일어나지 않을 것입니다.

색인 정보 ... 필드 5에만 색인이있는 경우 두 번째 색인에는 아마 2 키 조회를 사용하여 나머지 데이터를 가져옵니다. 첫 번째 요소는 와일드 카드 ()를 가지고 있기 때문에 아마이 인덱스를 무시할 것입니다. 그래서 제 2의 것이 예상대로 행동하는 것을 더 잘 추측합니다. 커버링 인덱스

후 2 일 다시 검색 인수에 대한 더 키 조회

비트 없다 ... 당신이 변수로 IN을 변경하면 다음 계획은 다시 변경됩니다. 상수를 사용하는 쿼리는 변수가있는 쿼리보다 빠릅니다. 상수를 사용하면 값이 앞에 표시되기 때문입니다.

, 당신은 그것을 시도 ...

+0

+1 "정수가있는 쿼리는 변수가있는 쿼리보다 빠릅니다. 상수를 사용하면 값이 앞쪽에 알려지기 때문입니다." 좋은 지적, 드물게 일어나는 것. 특히 데이터가 비뚤어지면 (예 : 95 % 남성, 5 % 여성), 측정 가능한 차이가 발생할 수 있습니다. 나는 항상 한정판에 올 것이지만, 아주 한정된 세트에서만 나온다. 그렇지 않으면 SQL 캐시를 "스팸"하게됩니다. 이 경우 바인드 변수가 더 좋을 것입니다. – Thilo

0

INLIKE 명령보다 빠릅니다 ...

+0

이 경우 IN이 LIKE보다 빠를 이유를 설명 할 수 있습니까? – stukelly