MySQL 索引失效情况(索引篇 三)

1. 索引列参与运算:当在索引列上进行运算操作时,MySQL无法直接使用索引进行优化。

例如,如果有一个索引列"age",而查询条件是"age+ 5 = 30",MySQL无法使用索引来快速定位满足条件的行。

--------------------------------

2. 模糊查询:模糊查询使用通配符(如%)或正则表达式进行模式匹配,这种查询方式通常无法充分利用索引。

例如,如果有一个索引列"name",而查询条件是"name like '%林%'",MySQL无法使用索引来快速定位匹配的行,而需要进行全表扫描。

--------------------------------

3. OR连接条件:当查询中使用OR操作符连接多个条件时,如果其中至少一个条件无法使用索引,整个查询都无法使用索引优化。

例如,如果有一个索引列"department",而查询条件是"department= '销售' OR age= 30",如果"年龄"列没有索引,MySQL无法使用索引来优化查询。

--------------------------------

4. 重复数据多:如果数据在索引列上的分布不均匀,即某些值的出现频率非常高,而其他值的出现频率很低,那么索引的选择性会降低。选择性是指索引中不重复的值的比例。当选择性较低时,MySQL可能会认为全表扫描比使用索引更快。

--------------------------------

5. 违反最左前缀法则:MySQL使用最左前缀法则来使用复合索引。如果有一个复合索引(A, B, C),那么查询时必须按照(A, B, C)的顺序使用索引列,否则索引无法被利用。

例如,如果有一个复合索引 idx_de_age(department, age),而查询条件是"age= 30",那么索引无法被使用。

--------------------------------

6. 隐式数据类型转换,通常是写SQL语句字符串不加引号'':当查询条件中的数据类型与索引列的数据类型不匹配时,MySQL可能会进行隐式数据类型转换(如字符串转数值,数值转字符串)。这可能导致索引失效,因为MySQL无法使用索引来处理转换后的值。

例子:如果有一个索引列"age"为整数类型,而查询条件是"age= '30' ",MySQL会将字符串'30'转换为整数,导致索引失效。

--------------------------------

7. 使用NOT操作符:在查询中使用NOT操作符时,MySQL通常无法使用索引来优化查询。因为NOT操作需要检查所有不满足条件的行,而不仅仅是满足条件的行。

例子:如果有一个索引列"status",而查询条件是"NOT status= '1' ",MySQL无法使用索引来快速定位不满足条件的行。

--------------------------------

8. 大数据范围查询:当查询涉及到大数据范围时,如使用between 和大于/小于操作符,MySQL可能会选择放弃使用索引而进行全表扫描。

例子:如果有一个索引列"销售额",有2千万条数据,而查询条件是"销售额 BETWEEN 1000 AND 20000000",MySQL可能会认为全表扫描比使用索引更快。

上一篇:MySQL索引分类和操作(增删查)、聚集索引、二级索引、覆盖索引(索引篇 二)

你可能感兴趣的:(MySQL数据库,mysql,android,数据库)