MYSQL索引失效场景及其原理

MySQL索引失效是指查询时不能有效利用索引,从而导致查询性能下降的现象。以下是一些常见的MySQL索引失效场景及原理:

使用函数或表达式:在WHERE子句中对索引列使用函数或表达式会导致索引失效。因为MySQL无法预先计算表达式的结果,所以无法使用索引进行查找。
例:SELECT * FROM users WHERE YEAR(birthday) = 1990;
原理:此查询中,YEAR函数作用在索引列birthday上,导致索引失效。

隐式类型转换:如果查询条件与索引列类型不匹配,MySQL会进行隐式类型转换,可能导致索引失效。
例:SELECT * FROM users WHERE age = '30';
原理:此查询中,假设age字段是整数类型,而查询条件使用了字符串类型,导致类型不匹配。MySQL会尝试将age字段转换为字符串,从而导致索引失效。

不等于(!= 或 <>)操作符:使用不等于操作符会导致索引失效,因为MySQL无法利用索引进行范围查找。
例:SELECT * FROM users WHERE age <> 30;
原理:此查询中,由于使用了不等于操作符,MySQL无法利用索引进行查找,因此索引失效。

范围查询的多列索引:对于多列联合索引,如果查询条件中包含范围查询(如BETWEEN、>、< 等),那么在范围查询之后的索引列将失效。
例:SELECT * FROM orders WHERE user_id = 1 AND order_date > '2022-01-01';
原理:假设存在一个多列联合索引(user_id, order_date),此查询中对order_date进行了范围查询,使得索引列order_date之后的索引失效。

OR 连接的条件:使用OR连接的条件可能导致索引失效,尤其是在OR条件中涉及多个索引列时。
例:SELECT * FROM users WHERE age = 30 OR name = 'Alice';
原理:此查询中,由于使用了OR连接,MySQL可能无法同时利用age和name两个索引列进行查找,导致索引失效。

LIKE 查询:如果在LIKE查询中,通配符(%或_)在字符串的开头,将导致索引失效。
例:SELECT * FROM users WHERE name LIKE '%Alice%';
原理:此查询中,由于通配符在字符串的开头,MySQL无法使用索引进行查找,因此索引失效。

需要注意的是,实际查询优化器会根据数据量、数据分布等因素决定是否使用索引。

posted @ 2023-04-19 12:02  itqczzz  阅读(126)  评论(0编辑  收藏  举报