2008-11-03 6 views
6

하나의 특정 필드가 두 값 중 하나 인 모든 행을 찾기 위해 표를 검색하려고합니다. 나는 값이 무엇인지 정확하게 알고 있지만, 가장 효율적인 검색 방법이 무엇인지 궁금해합니다. 예를 들어IN 또는 텍스트 검색 사용

두 값은 "xpoints"와 "ypoints"입니다. 나는 마지막에 "포인트"가 해당 필드에 다른 값이 없을 것이라는 점을 확실히 알고, 그래서 고려하고 두 쿼리는 다음과 같습니다

WHERE `myField` IN ('xpoints', 'ypoints') 
--- or... 
WHERE `myField` LIKE '_points' 

은이 경우 최상의 결과를 줄 것이다?

답변

14

항상 SQL 쿼리와 마찬가지로 프로파일 러를 통해 SQL 쿼리를 실행하여 찾습니다. 그러나 내 직감은 IN 검색이 더 빠를 것이라고 말합니다. 특히 필드에서 색인을 생성하면 예제에서 2 개의 조회 만 수행하면됩니다. 검색을 수행 한 경우 특정 값으로 끝나는 레코드를 찾고 있기 때문에 검색을 수행해야 할 수 있습니다. LIKE '_points'가 'gpoints'또는 다른 유사한 문자열을 반환 할 수도 있으므로 더 정확할 것입니다.

+0

물론 테이블의 실제 크기에 따라 달라집니다. 작 으면 옵티마이 저는 단순히 테이블 스캔을 선택합니다. –

1

문제의 열에서 데이터 항목 모두 'X'또는 'Y', 내가 IN이 항상 더 나은 쿼리를 줄 것이다 생각으로 시작하지 않는 한. @Kibbee가 지적한 것처럼 색인이 생성되면 두 검색을 모두 수행하기 만하면됩니다. 또는 인덱스가 지정되지 않은 경우 IN을 사용하는 테이블 스캔은 대부분의 경우 첫 번째 문자 만 검사해야하지만 LIKE를 사용하면 매번 두 문자를 검사해야합니다 (모든 항목이 적어도 2 자임을 전제로). 첫 번째 문자는 아무 것도 허용됩니다.

0

시도해보십시오. 많은 양의 테스트 데이터를 생성하고 myfield에 인덱스가 있거나없는 인덱스를 사용해보십시오. 당신이 그것에있는 동안 LIKE 'points'와 'LIKE'xpoint '사이에 눈에 띄는 차이가 있는지 확인하십시오.

각 쿼리에서 옵티마이 저가 수행하는 작업에 따라 다릅니다.

소량의 데이터의 경우 차이는 무시할 수 있습니다. 어느 것이 더 합리적이든 마라. 대량의 데이터의 경우 디스크 I/O의 양은 CPU 시간보다 훨씬 중요합니다.

나는 myfield에 대한 인덱스가있는 경우 IN이, LIKE보다 더 나은 결과를 얻을 수 있다는 걸거야. 나는 또한 'xpoint_'가 '_points'보다 빠르게 실행된다는 사실에 도박을 걸고 있습니다. 그러나 직접 시도하는 것만 큼 없습니다.

0

MySQL은 같은 LIKE '% foo는'또는 '_foo'와 같은 문자열 비교를 사용하는 경우 인덱스를 사용할 수 없지만 '푸 %'와 'foo_'와 같은 비교에 대한 인덱스를 사용할 수 있습니다.

그래서 귀하의 경우 IN은 필드가 인덱싱되었다고 가정하면 훨씬 빨라집니다.

제한된 값으로 작업하는 경우 필드를 ENUM으로 지정하는 것이 좋습니다. MySQL은이를 내부적으로 정수로 저장하고 이러한 종류의 조회를 훨씬 빠르게 만들고 디스크 공간을 절약합니다.

0

LIKE 버전보다 IN 버전을 수행하는 것이 더 빠릅니다. 특히 와일드 카드가 비교의 끝에 있지 않을 때, 이상적인 조건 하에서조차도 귀하의 질의가 최대 질의 삽입물의 크기에 근접 할 때까지 IN은 여전히 ​​이상적입니다.