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 时,这个索引就无法发挥作用,从而导致索引失效。