MySQL中索引的作用是优化查询效率,但有时候我们会发现索引并没有起到预期的作用,甚至会导致性能变差。这是因为索引失效了。
索引失效有多种原因,下面我们逐一分析。
1. 使用函数或表达式进行查询
如果我们在查询时使用了函数或表达式,MySQL就会放弃使用索引而进行全表扫描。比如:
SELECT * FROM table WHERE YEAR(register_time) = 2019;
这段SQL语句就会导致索引失效,因为YEAR()函数会让MySQL放弃使用索引。
2. 对索引列进行运算或函数操作
如果我们在索引列上进行运算或函数操作,MySQL也会放弃使用索引而进行全表扫描。比如:
SELECT * FROM table WHERE id % 2 = 0;
这段SQL语句中对id列取余操作,也会让MySQL放弃使用id索引。
3. 查询条件中使用了NOT
如果我们使用了NOT,MySQL也会放弃使用索引而进行全表扫描。比如:
SELECT * FROM table WHERE NOT id = 1;
这段SQL语句中使用了NOT,MySQL就不会使用id索引。
4. 查询条件中使用了OR
如果我们使用了OR,MySQL也会放弃使用索引而进行全表扫描。比如:
SELECT * FROM table WHERE id = 1 OR name = 'tom';
这段SQL语句中使用了OR,MySQL就不会使用id和name的索引。
5. 查询条件中使用了索引的最左前缀
MySQL索引是最左前缀匹配的,如果我们使用了索引的最左前缀,而没有使用索引的其他部分,MySQL也会放弃使用索引而进行全表扫描。比如:
SELECT * FROM table WHERE id = 1 AND name = 'tom';
假设我们的索引是(id, name),但是在查询中只使用了id,MySQL就不会使用索引,而是进行全表扫描。
以上就是MySQL索引失效的五种情况,我们在编写查询语句时,尽量避免这些情况的出现,以提高查询效率。