索引大解析

索引

一、索引概念和类型
1.1 什么是索引

​ **百度百科:**索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的特殊数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。

​ 通俗的说,索引就是一种数据库中的数据结构,这类似于我们在字典中查汉字时,使用偏旁查询,这里的偏旁就相当于索引。根据数据存储引擎不同,底层有不同的实现方式。 存储引擎就是数据文件在磁盘上的组织形式,常见的存储引擎有memory,Innodb,Myisam等。memory中索引的底层数据结构是hash表,而Innodb和Myisam索引底层的数据结构是B+树。

在这里插入图片描述

在这里插入图片描述

1.2 为什么要使用索引
  • 加快查询速度。为了提高数据检索的速度,我们可以给数据表加上索引。索引可以减少访问磁盘IO的次数,进而优化查询,提高速度。
  • 保证数据的唯一性。通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。

注意:然而建立索引并不是越多越好,也并不是所有场景都适合建立索引。索引作为一种数据结构,会占用磁盘空间,提高查询效率的同时,降低了更新表的效率。每次对表进行增删改操作,MySQL不仅要保存数据,还有保存或者更新对应的索引文件。 在数据表数据量较少或者更新频繁以及数据类型少的数据表,也不适合添加索引。

1.3 索引分类

​ 按照不同的分类维度,索引可以分为不同的类型。可以按照使用类型、数据结构以及存储形式分类,如下图所示:

在这里插入图片描述

普通索引:最基本的索引,它没有任何限制,仅仅为了加速查询。

唯一索引:索引列的值必须唯一,但允许有空值。

主键索引:一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。

组合索引:指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用组合索引时遵循最左前缀原则。

全文索引:主要用来查找文本中的关键字,而不是直接与索引中的值相比较。fulltext索引跟其它索引大不相同,它更像是一个搜索引擎,而不是简单的where语句的参数匹配。fulltext索引配合match against操作使用,而不是一般的where语句加like。

1.4 聚簇索引与非聚簇索引

​ 首先需要明白聚簇索引和非聚簇索引不是一种新的索引类型,而是一种数据存储方式,聚簇表示数

据行和相邻的键值紧凑地存储在一起 。

​ 聚簇索引:一般指的是主键索引(如果存在主键索引的话),聚簇索引也被称之为聚集索引。

​ 非聚簇索引:非聚簇索引在 InnoDB存储 引擎中,也叫二级索引。

​ 聚簇索引叶子节点存储的是行数据,因此通过聚簇索引可以直接找到真正的行数据;而非聚簇索引叶子节点存储的是主键信息,所以使用非聚簇索引还需要回表查询。聚簇索引查询效率更高,而非聚簇索引需要进行回表查询,因此性能不如聚簇索引。

二、索引注意事项与索引优化
2.1 索引覆盖与回表

​ 索引覆盖:我们查询的字段,存储在查找所用的索引树上,可以直接提供查询结果。不需要通过主键索引,去主键索引树上查询数据,这种只扫描一次索引树,索引覆盖了我们的查询需求,我们称之为索引覆盖。

​ 回表:通过普通索引树搜索所要查询数据的主键信息,再通过查询主键索引树,得到所要查询数据的这个过程,称之为回表。

​ 我们都知道,主键索引的叶子节点存的是整行数据,非主键索引的叶子节点内容是主键的值。基于非主键索引的查询需要多扫描一棵索引树,一般会产生回表现象。因此,我们在应用中应该尽量使用主键查询。因为覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用 的性能优化手段。

2.2 索引失效情况

​ 我们使用索引是为了提高查询数据的速度,但是并不是创建了索引,查询的时候就一定会用上索引,在某些情况下会出现索引失效的情况:

  • 查询条件包含OR
  • 查询条件中含有like通配符,以%开头
  • 在索引列上使用mysql的内置函数 或使用算术运算符
  • 索引字段上使用(!= 或者 < >,not in)
  • 使用组合索引,查询时的条件列不是组合索引中的第一个列
  • 在索引列上使用 IS NULL 或 IS NOT NULL操作
  • 当全表扫描速度比索引速度快时,mysql会使用全表扫描,此时不走索引
2.3 创建索引注意事项

​ 创建一个好的索引,能够在查询数据的时候,加快速度。但是,很多情况下的索引并不能提高查询的效率,需要注意的情况如下所示:

  • 索引的个数应该适量 。并不是索引越多越好,索引需要占用空间,更新时也需要维护。
  • 索引索引应该建在查询应用频繁的字段 ,频繁更新的值和区分度低的字段 ,不要作为主键或者索引 。
  • 组合索引把散列性高(区分度高)的值放在前面 。
  • 创建组合索引,而不是修改单列索引,组合索引代替多个单列索引 。
  • 不建议使用无序的值作为索引。
2.4 索引优化

合理设计和使用索引,是优化慢SQL的好方法。以下方法,可以优化索引:

  • 尽量做到索引覆盖,避免回表。
  • 组合索引,尽量满足最左前缀原则。
  • union、in、or 都能够命中索引,建议使用 in。
  • like语句的前导模糊查询不能使用索引。
  • 不要在索引列上面做任何操作(计算、函数),否则会导致索引失效而转向全表扫描。
  • 索引不会包含有NULL值的列。
  • 单表索引建议控制在5个以内。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值