2015-01-21 80 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