淘先锋技术网

首页 1 2 3 4 5 6 7

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索引失效的五种情况,我们在编写查询语句时,尽量避免这些情况的出现,以提高查询效率。