2015-01-21 1 views
3

필자의 테스트에서, 매개 변수와 비교되는 LIKE를 포함하는 where 절이있는 mysql select 문은 인덱스를 사용하지 않습니다. 전체 테이블 스캔이 완료되고 성능이 저하됩니다. 예 :매개 변수가있는 mysql LIKE where 절은 인덱스를 사용하지 않습니다.

set @gp1:= 'BOB%'; 
select * from quote where quoteNum like @gp1; -- this is slow 

값이 인라인되면 색인이 사용됩니다. 예 :

select * from quote where quoteNum like 'BOB%'; -- this is fast 

첫 번째 예제에서 mysql이 인덱스를 사용하도록 강제 할 수 있습니까?

답변

4

문자 집합 및 변수의 데이터 정렬은 쿼리가 작동하려면 컬럼과 동일해야합니다.

SET character_set_connection = latin1; 
SET collation_connection = latin1_swedish_ci; 
set @gp1:= 'BOB%'; 
select * from quote where quoteNum like @gp1; -- this is fast now 

이 답변은 비슷한 문제를 다루고 있습니다. https://stackoverflow.com/a/15032843/176868

2

에 따라 힘 지수 ...


SELECT * FROM employee USE INDEX (emp_name_index) 
    WHERE emp_name like 'white%'; 
+0

작동하지 않습니다. "set @ gp1 : = 'JDV21501008 %'의 출력은 quote use index (quoteNum)에서 select *를 설명합니다. 여기서 quoteNum은 @ gp1과 같습니다." 전체 테이블 스캔을 보여줍니다. –

+0

명확하게하려면 예제가 작동하지만 매개 변수화 된 쿼리를위한 솔루션이 필요하며 솔루션이 해당 쿼리에 적합하지 않습니다. –

+0

아쉽게도 WHERE 절의 변수 값은 인덱스를 선택하는 데 사용되지 않으므로 올바른 인덱스를 돕기 위해 'USE INDEX'를 사용해야합니다. 이것은 SQL Server에서와 동일합니다. mysql에 어떤 인덱스를 사용해야하는지 "알리는"문제는 무엇입니까? – i486

관련 문제