MySql-索引失效的情况

1.模糊查询时%在开头

当使用模糊查询(如使用 LIKE '%keyword%')时,如果通配符 % 出现在搜索关键字的开头,那么索引将无法被有效利用,从而导致索引失效。

当通配符出现在搜索关键字的开头时,索引失效的主要原因是因为索引是按照值的顺序进行存储和排序的,而通配符 % 出现在开头时,表示需要匹配任意长度的字符串,这样就无法利用索引的有序性进行高效的检索。

举个例子,假设有一个列 col1 上建立了索引,并进行了模糊查询:WHERE col1 LIKE '%keyword'。在这个查询中,由于 % 出现在关键字的开头,数据库无法利用索引的有序性来快速定位匹配的记录,而是需要逐条扫描所有记录,这导致了索引失效和性能下降。

2.对列进行运算/对列使用函数

当对列进行运算(如加减乘除、函数操作)后,如果这个运算结果参与到查询条件中,有时会导致数据库无法有效地使用索引,从而影响查询性能。

举例来说,如果有一个列 col1 上建立了索引,并且在查询中使用了 col1 * 2 = 10 这样的条件,这种情况下数据库可能无法直接利用 col1 的索引来加速查询,因为需要先对 col1 进行运算,然后才能进行匹配。这就导致了索引失效,从而可能降低查询性能。

3.列使用了类型转换

当在查询条件中对列进行类型转换时,数据库系统可能无法有效地利用索引来加速查询,从而导致性能下降。

4.where判断条件有or

or只需表达式的一个条件满足就会返回真,那么实际上会进行全表查询

5.where条件为is not null或者!=之类的范围查询

在查询过程中回表次数过多,系统会认为使用索引的时间成本高于全表扫表,而直接进行全表扫描,不走索引。(一般界限是全表范围的20%)比如当where判断条件是is not null或者!=时,回表数量可能会很大,也可能产生索引失效。

6.非最左匹配

最左匹配是指在使用复合索引(Composite Index)时,查询条件中的列必须按照索引中列的顺序从最左边开始依次匹配,才能充分利用该索引进行高效的数据检索。

举个例子,假设有一个复合索引包含 (col1, col2, col3),当查询条件中只包含 col2 和 col3 而不包含 col1 时,这个索引就无法发挥作用,从而导致索引失效。

MySQL索引失效通常发生在以下几种情况下: 1. **全表扫描(Full Table Scan)**:当查询不包含索引列中的条件,或者查询的条件使得索引的范围搜索变为从表的开始到结束,MySQL会执行全表扫描,此时索引就无法发挥作用。 2. **索引列上有函数操作**:如果查询中对索引列进行了函数操作(如`LIKE`, `BETWEEN`, `SUBSTRING`等),导致索引无法直接使用,MySQL会忽略索引。 3. **索引键值重复**:如果索引列中有大量或全部相同的值,索引可能无法区分记录,比如在复合索引中,第一个字段的值相同。 4. **覆盖索引未被利用**:对于那些查询只需要索引列本身就可以完成的情况,如果查询结果包括了索引之外的数据,MySQL需要回表获取,索引失效了。 5. **索引列有NULL值**:在某些数据库引擎(如InnoDB)中,NULL值无法在索引中存储,所以含有NULL值的列创建的索引会部分无效。 6. **索引选择性低**:索引的选择性指的是不同唯一值的数量与总行数的比率,低选择性的索引在过滤数据时效率较低。 7. **动态SQL或预编译**:如果使用动态SQL或存储过程创建的索引,可能会因为每次运行时使用的条件不同而导致索引失效。 遇到索引失效,可以通过分析查询语句、优化查询策略、调整索引设计或重构查询来改善性能。如果你遇到特定的问题,可以详细描述查询和表结构,以便更精确地诊断原因。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值