2015-01-21 52 views
3

在我的測試中,mysql select語句的where子句中包含一個與參數比較的LIKE,不會使用索引。全表掃描完成,性能受損。例如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%'的輸​​出;解釋select * from引用使用索引(quoteNum),其中quoteNum像@ gp1;」顯示全表掃描。 – 2015-01-21 03:04:20

+0

要清楚,您的示例確實可行,但我需要參數化查詢的解決方案,並且您的解決方案對此無效。 – 2015-01-21 04:04:02

+0

不幸的是,WHERE子句中的變量值不用於選擇索引,而必須使用'USE INDEX'來幫助正確的索引。這在SQL Server中是一樣的。有什麼問題告訴mysql它必須使用哪個索引? – i486 2015-01-26 22:58:28