`
gaozzsoft
  • 浏览: 426973 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

MySQL索引失效的情况总结

 
阅读更多

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种情况.docx

    ### MySQL索引失效的11种情况 #### 知识点概述 在MySQL数据库中,索引是非常重要的优化工具之一,它可以显著加快数据检索的速度。然而,在某些情况下,索引可能会失效,导致查询效率降低。了解这些情况对于优化...

    导致MySQL索引失效的一些常见写法总结

    在MySQL数据库中,索引是一种重要的优化手段,它能够显著...以上就是关于导致MySQL索引失效的一些常见情况及其避免方法。在实际工作中,我们需要结合具体业务场景和查询需求,合理设计和使用索引,以提高数据库性能。

    mysql面试题,涉及MySQL基础、MySQL索引、MySQL语句 MySQL进阶等方面,适用于初、中级开发人员

    MySQL 面试题知识点总结 MySQL 是一种关系型数据库管理系统,广泛应用于各种 Web 应用程序中。 MySQL 面试题涵盖了 MySQL 基础、 MySQL 索引、 MySQL 语句、 MySQL 进阶等方面的内容,本文将对这些知识点进行详细...

    5分钟掌握Mysql索引使用和失效.zip

    总结来说,掌握MySQL索引的使用和失效原因,能帮助我们构建高性能的数据库系统,降低IO成本,提高数据检索效率,减少不必要的排序和临时表生成。通过明智地创建、使用和管理索引,我们可以显著提升数据库的整体性能...

    MySQL索引建立选择和常见失效原因总结,这些你都得知道

    MySQL索引是数据库管理系统中用于加速数据检索的关键结构。索引的选择和管理对于数据库性能至关重要。以下是关于如何选择建立索引、可能导致索引失效的原因以及使用索引时应注意的事项的详细说明。 **适合建立索引...

    接口响应慢的处理办法-mysql索引不生效情况分析

    ### 接口响应慢的处理办法—MySQL索引不生效情况分析 #### 一、引言 在数据库操作中,索引是提高查询性能的重要工具之一。然而,在实际使用过程中,由于各种原因,索引可能会出现不生效的情况,从而导致查询效率...

    mysql索引优化学习讲义以及示例

    总结:在优化MySQL索引时,应遵循“最佳左前缀法则”,保持索引列的连续性。同时,理解并利用索引在范围查询、排序和覆盖索引中的作用,可以有效地提升查询性能。在编写SQL语句时,要考虑到索引的使用,避免全表扫描...

    mysql高级视频教程百度云(2019).txt

    59.MySQL高级_索引失效行锁变表锁.avi 58.MySQL高级_行锁演示答疑补充.avi 57.MySQL高级_行锁案例讲解.avi 56.MySQL高级_行锁理论.avi 55.MySQL高级_读锁案例讲解2.avi 54.MySQL高级_读锁案例讲解.avi ...

    mysql的in会不会让索引失效?

    总结来说,`IN`操作符是否使索引失效主要取决于以下几点: 1. 索引是否已存在于查询的列上。 2. `IN`列表的大小,过大可能使MySQL放弃使用索引。 3. 查询语句的其他部分,如是否存在`ORDER BY`等子句。 优化`IN`...

    mysql 索引1

    总结来说,MySQL索引是一个复杂且重要的主题,合理使用和优化索引可以显著提升数据库性能,但也要注意避免索引的滥用和失效情况,确保数据库的高效运行。在设计和维护数据库时,需要持续关注查询性能和索引的使用...

    2021年MySQL高级教程视频.rar

    16.MySQL高级锁MyISAM表锁小结.avi 17.MySQL高级锁MyISAM表锁查看锁争用情况.avi 18.MySQL高级锁InnoDB行锁介绍及背景知识.avi 18.MySQL高级锁InnoDB行锁类型.avi 19.MySQL高级锁InnoDB行锁基本演示.avi 20.MySQL...

    mysql相关知识点的总结

    在 MySQL 中,索引的使用可以提高查询效率,但需要遵守一定的规则,例如最左前缀法则,避免回表查询,避免索引失效。使用 or 两边都要有索引,否则索引失效。字符串不加引号索引失效,模块查询头不配匹就会失效。 ...

    尚硅谷Java视频教程_MySQL高级视频

    · 00.尚硅谷_MySQL高级_源码...尚硅谷_MySQL高级_索引失效行锁变表锁 · 60.尚硅谷_MySQL高级_间隙锁危害 · 61.尚硅谷_MySQL高级_如何锁定一行 · 62.尚硅谷_MySQL高级_行锁总结 · 63.尚硅谷_MySQL高级_主从复制

    这种sql写法真的会导致索引失效吗

    总结来说,虽然使用`OR`操作符的SQL语句可能在某些情况下导致索引失效,但在MySQL 5.0之后,通过`index_merge`特性,我们可以有效地利用多个索引。然而,这并不意味着所有包含`OR`的查询都能自动优化,数据库管理员...

    mysql索引与树结构(索引简介、索引用法详解、B-Tree索引结构、索引导致的问题).docx

    - **使用函数**: 在WHERE子句中对列应用函数会导致索引失效。 - **类型不匹配**: 如果查询时的数据类型与索引定义的类型不一致,索引也会失效。 #### 四、索引导致的问题 - **索引带来的负面影响** - **写入...

    2023最新版Mysql面试题总结,来自大厂的宝典经验.pdf

    索引可以提高查询效率,但也可以导致索引失效。 二、建表规约 2.1 表达是与否概念的字段,必须使用 is_xxx 的方式命名,数据类型是 unsigned tinyint(1 表示是,0 表示否)。 2.2 表名、字段名必须使用小写字母...

    MySQL索引不会被用到的情况汇总

    本篇文章将详细探讨MySQL索引不会被用到的一些常见情况。 首先,了解MySQL中的四种基本索引类型: 1. 普通索引(INDEX):无任何限制,允许重复值。 2. 唯一索引(UNIQUE):索引列的值必须唯一,但允许为空值。 3...

    mysql高级笔记,mysql索引、存储过程、查询缓存、并发参数调整、MyISAM表锁、系统性能优化

    首先,我们来讨论**MySQL索引**。索引是提高查询速度的关键,它在数据库中的作用类似于书籍的目录。B树、哈希索引和全文索引是常见的索引类型。B树索引适用于范围查询和排序,而哈希索引则适用于等值查询。全文索引...

    MySQL 70 道面试题及答案.docx

    5. 在索引列上使用 MySQL 的内置函数,索引失效。 6. 对索引列运算(如,+、-、*、/),索引失效。 7. 索引字段上使用(!= 或 ,not in)时,可能会导致索引失效。 8. 索引字段上使用 is null,is not null,可能...

Global site tag (gtag.js) - Google Analytics