mysql中like走索引吗

mysql中like走索引吗
最新回答
灿烂星空

2024-04-26 22:42:51

MySQL中LIKE查询是否走索引取决于通配符位置和索引类型,并非绝对失效,关键看匹配模式是否符合索引结构要求


一、LIKE查询与索引的核心关系
MySQL索引(尤其是B+树索引)的有序性依赖左前缀匹配,因此LIKE的生效规则可概括为:
1. 通配符在开头(`%xxx`):索引失效
B+树按字段左前缀排序,若开头用`%`,则无法通过索引快速定位,只能全表扫描。
2. 通配符在中间或结尾(`xxx%`或`x%x`):索引可能生效
• 若为`xxx%`(前缀匹配):可利用索引左前缀特性,快速定位到以`xxx`开头的记录。
• 若为`x%x`(中间匹配):仅当`x`为前缀时生效(如`a%`匹配`abc`),若需匹配中间字符(如`%bc%`),仍无法利用普通索引。


二、索引失效的其他关联场景
除通配符位置外,以下情况也会导致LIKE查询无法走索引:
1. 类型不匹配
若索引列是`int`类型,查询用`LIKE '123'`(字符串),因类型转换会使索引失效。
2. 联合索引不满足最左前缀
若联合索引为`(a,b,c)`,仅用`b LIKE 'xxx%'`(跳过最左列`a`),索引无法生效。
3. MySQL优化器评估全表更快
若查询返回数据量过大(如超过表的30%),优化器会认为全表扫描更高效,主动放弃索引。


三、优化建议
1. 优先用前缀匹配:将`%xxx`改为`xxx%`,确保索引生效。
2. 全文索引替代:若需匹配中间/后缀(如`%abc%`),可改用MySQL`FULLTEXT`索引(需MySQL5.6+且列类型为`char/varchar/text`)。
3. 避免类型转换:查询条件与索引列类型严格一致(如`int`列用`=123`而非`LIKE '123'`)。