MySQL索引失效的几种情况总结(转载)
1.索引不存储null值
更准确的说,单列索引不存储null值,复合索引不存储全为null的值。索引不能存储Null,所以对这列采用is null条件时,因为索引上根本
没Null值,不能利用到索引,只能全表扫描。
为什么索引列不能存Null值?
将索引列值进行建树,其中必然涉及到诸多的比较操作。Null值的特殊性就在于参与的运算大多取值为null。
这样的话,null值实际上是不能参与进建索引的过程。也就是说,null值不会像其他取值一样出现在索引树的叶子节点上。
2.不适合键值较少的列(重复数据较多的列)
假如索引列TYPE有5个键值,如果有1万条数据,那么 WHERE TYPE = 1将访问表中的2000个数据块。
再加上访问索引块,一共要访问大于200个的数据块。
如果全表扫描,假设10条数据一个数据块,那么只需访问1000个数据块,既然全表扫描访问的数据块
少一些,肯定就不会利用索引了。
3.前导模糊查询不能利用索引(like '%XX'或者like '%XX%')
假如有这样一列code的值为'AAA','AAB','BAA','BAB' ,如果where code like '%AB'条件,由于前面是
模糊的,所以不能利用索引的顺序,必须一个个去找,看是否满足条件。这样会导致全索引扫描或者全表扫
描。如果是这样的条件where code like 'A % ',就可以查找CODE中A开头的CODE的位置,当碰到B开头的
数据时,就可以停止查找了,因为后面的数据一定不满足要求。这样就可以利用索引了。
4.索引失效的几种情况
1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)
要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
2.对于多列索引,不是使用的第一部分,则不会使用索引
3.like查询以%开头
4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
5.如果mysql估计使用全表扫描要比使用索引快,则不使用索引
5.MySQL主要提供2种方式的索引:B-Tree索引,Hash索引
B树索引具有范围查找和前缀查找的能力,对于有N节点的B树,检索一条记录的复杂度为O(LogN)。相当于二分查找。
哈希索引只能做等于查找,但是无论多大的Hash表,查找复杂度都是O(1)。
显然,如果值的差异性大,并且以等值查找(=、 <、>、in)为主,Hash索引是更高效的选择,它有O(1)的查找复杂度。
如果值的差异性相对较差,并且以范围查找为主,B树是更好的选择,它支持范围查找。
1) 没有查询条件,或者查询条件没有建立索引
2) 在查询条件上没有使用引导列
3) 查询的数量是大表的大部分,应该是30%以上。
4) 索引本身失效
5) 查询条件使用函数在索引列上,或者对索引列进行运算,运算包括(+,-,*,/,! 等) 错误的例子:select * from test where id-1=9; 正确的例子:select * from test where id=10;
6) 对小表查询
7) 提示不使用索引
8) 统计数据不真实
9) CBO计算走索引花费过大的情况。其实也包含了上面的情况,这里指的是表占有的block要比索引小。
10)隐式转换导致索引失效.这一点应当引起重视.也是开发中经常会犯的错误. 由于表的字段tu_mdn定义为varchar2(20),但在查询时把该字段作为number类型以where条件传给Oracle,这样会导致索引失效. 错误的例子:select * from test where tu_mdn=13333333333; 正确的例子:select * from test where tu_mdn='13333333333';
12) 1,<> 2,单独的>,<,(有时会用到,有时不会)
13,like "%_" 百分号在前.
4,表没分析.
15,单独引用复合索引里非第一位置的索引列.
16,字符型字段为数字时在where条件里不添加引号.
17,对索引列进行运算.需要建立函数索引.
18,not in ,not exist.
19,当变量采用的是times变量,而表的字段采用的是date变量时.或相反情况。
20,B-tree索引 is null不会走,is not null会走,位图索引 is null,is not null 都会走
21,联合索引 is not null 只要在建立的索引列(不分先后)都会走, in null时 必须要和建立索引第一列一起使用,当建立索引第一位置条件是is null 时,其他建立索引的列可以是is null(但必须在所有列 都满足is null的时候),或者=一个值; 当建立索引的第一位置是=一个值时,其他索引列可以是任何情况(包括is null =一个值),以上两种情况索引都会走。其他情况不会走。
Mysql索引会失效的几种情况分析
索引并不是时时都会生效的,比如以下几种情况,将导致索引失效:
1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)
注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引
2.对于多列索引,不是使用的第一部分,则不会使用索引
3.like查询是以%开头
4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引
5.如果mysql估计使用全表扫描要比使用索引快,则不使用索引
此外,查看索引的使用情况
show status like ‘Handler_read%';
大家可以注意:
handler_read_key:这个值越高越好,越高表示使用索引查询到的次数
handler_read_rnd_next:这个值越高,说明查询低效
相关推荐
### MySQL索引失效的11种情况 #### 知识点概述 在MySQL数据库中,索引是非常重要的优化工具之一,它可以显著加快数据检索的速度。然而,在某些情况下,索引可能会失效,导致查询效率降低。了解这些情况对于优化...
在MySQL数据库中,索引是一种重要的优化手段,它能够显著...以上就是关于导致MySQL索引失效的一些常见情况及其避免方法。在实际工作中,我们需要结合具体业务场景和查询需求,合理设计和使用索引,以提高数据库性能。
MySQL 面试题知识点总结 MySQL 是一种关系型数据库管理系统,广泛应用于各种 Web 应用程序中。 MySQL 面试题涵盖了 MySQL 基础、 MySQL 索引、 MySQL 语句、 MySQL 进阶等方面的内容,本文将对这些知识点进行详细...
总结来说,掌握MySQL索引的使用和失效原因,能帮助我们构建高性能的数据库系统,降低IO成本,提高数据检索效率,减少不必要的排序和临时表生成。通过明智地创建、使用和管理索引,我们可以显著提升数据库的整体性能...
MySQL索引是数据库管理系统中用于加速数据检索的关键结构。索引的选择和管理对于数据库性能至关重要。以下是关于如何选择建立索引、可能导致索引失效的原因以及使用索引时应注意的事项的详细说明。 **适合建立索引...
### 接口响应慢的处理办法—MySQL索引不生效情况分析 #### 一、引言 在数据库操作中,索引是提高查询性能的重要工具之一。然而,在实际使用过程中,由于各种原因,索引可能会出现不生效的情况,从而导致查询效率...
总结:在优化MySQL索引时,应遵循“最佳左前缀法则”,保持索引列的连续性。同时,理解并利用索引在范围查询、排序和覆盖索引中的作用,可以有效地提升查询性能。在编写SQL语句时,要考虑到索引的使用,避免全表扫描...
59.MySQL高级_索引失效行锁变表锁.avi 58.MySQL高级_行锁演示答疑补充.avi 57.MySQL高级_行锁案例讲解.avi 56.MySQL高级_行锁理论.avi 55.MySQL高级_读锁案例讲解2.avi 54.MySQL高级_读锁案例讲解.avi ...
总结来说,`IN`操作符是否使索引失效主要取决于以下几点: 1. 索引是否已存在于查询的列上。 2. `IN`列表的大小,过大可能使MySQL放弃使用索引。 3. 查询语句的其他部分,如是否存在`ORDER BY`等子句。 优化`IN`...
总结来说,MySQL索引是一个复杂且重要的主题,合理使用和优化索引可以显著提升数据库性能,但也要注意避免索引的滥用和失效情况,确保数据库的高效运行。在设计和维护数据库时,需要持续关注查询性能和索引的使用...
16.MySQL高级锁MyISAM表锁小结.avi 17.MySQL高级锁MyISAM表锁查看锁争用情况.avi 18.MySQL高级锁InnoDB行锁介绍及背景知识.avi 18.MySQL高级锁InnoDB行锁类型.avi 19.MySQL高级锁InnoDB行锁基本演示.avi 20.MySQL...
在 MySQL 中,索引的使用可以提高查询效率,但需要遵守一定的规则,例如最左前缀法则,避免回表查询,避免索引失效。使用 or 两边都要有索引,否则索引失效。字符串不加引号索引失效,模块查询头不配匹就会失效。 ...
· 00.尚硅谷_MySQL高级_源码...尚硅谷_MySQL高级_索引失效行锁变表锁 · 60.尚硅谷_MySQL高级_间隙锁危害 · 61.尚硅谷_MySQL高级_如何锁定一行 · 62.尚硅谷_MySQL高级_行锁总结 · 63.尚硅谷_MySQL高级_主从复制
总结来说,虽然使用`OR`操作符的SQL语句可能在某些情况下导致索引失效,但在MySQL 5.0之后,通过`index_merge`特性,我们可以有效地利用多个索引。然而,这并不意味着所有包含`OR`的查询都能自动优化,数据库管理员...
- **使用函数**: 在WHERE子句中对列应用函数会导致索引失效。 - **类型不匹配**: 如果查询时的数据类型与索引定义的类型不一致,索引也会失效。 #### 四、索引导致的问题 - **索引带来的负面影响** - **写入...
索引可以提高查询效率,但也可以导致索引失效。 二、建表规约 2.1 表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint(1 表示是,0 表示否)。 2.2 表名、字段名必须使用小写字母...
本篇文章将详细探讨MySQL索引不会被用到的一些常见情况。 首先,了解MySQL中的四种基本索引类型: 1. 普通索引(INDEX):无任何限制,允许重复值。 2. 唯一索引(UNIQUE):索引列的值必须唯一,但允许为空值。 3...
首先,我们来讨论**MySQL索引**。索引是提高查询速度的关键,它在数据库中的作用类似于书籍的目录。B树、哈希索引和全文索引是常见的索引类型。B树索引适用于范围查询和排序,而哈希索引则适用于等值查询。全文索引...
5. 在索引列上使用 MySQL 的内置函数,索引失效。 6. 对索引列运算(如,+、-、*、/),索引失效。 7. 索引字段上使用(!= 或 ,not in)时,可能会导致索引失效。 8. 索引字段上使用 is null,is not null,可能...