Mysql数据库索引的理解及聚簇索引和非聚簇索引的区别

概念

索引是帮助Mysql搞笑获取数据的数据结构
对Mysql数据库来讲,其核心就是存储引擎,而索引就是属于存储引擎级别的概念,不同的存储引擎对索引的实现方式是不同的。

索引的优点

1.提高数据检索效率,降低数据库的IO成本
2.通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗
3.大大加快了数据的查询速度

索引的缺点

1.创建索引和维护索引需要耗费时间,并且随着数据量的增加所耗费的时间也会增加
2.索引也需要占用空间,我们知道数据表中的数据也会有最大上限设置的,如果我们有大量的索引,索引文件可能会比数据文件更快达到上限值
3.当对表中的数据进行增加,删除,修改时,索引也需要动态的维护,降低了数据的维护速度

索引的使用原则

1.主键自动建立唯一索引
2.频繁作为查询条件的字段应该创建索引
3.查询中与其他表关联的字段,外键关系建立索引
4.频繁更新的字段不适合建立索引,因为每次更新不单单更新了记录还会更新索引
5.WHERE条件里用不到的字段不创建索引
6.单键和组合索引的选择问题,(高并发情况下适合创建组合索引)
7.查询中排序的字段,排序的字段若通过索引去访问将大大提高排序速度
8.查询中统计或者分组字段

不适合使用索引的场合

1.对经常更新的表就避免对其进行过多的索引,对经常用于查询的字段应该创建索引
2.数据量小的表最好不要使用索引,由于数据较少,可能查询全部数据时间比遍历索引的时间还要短,索引就可能不会产生优化效果
3.在不同值少的列上不要建立索引

索引的分类

1.单列索引

单列索引只包含单个列,但另一个表中可有多个单列索引

普通索引

普通索引允许在定义索引的列中插入重复值和空值

唯一索引

索引列中的值必须是唯一的,但是允许为空值

主键索引

主键索引是一种特殊的唯一索引,不允许有空值

2.复合索引

在表中的多个字段上组合上创建的索引,只有在查询条件中使用了组合的多个字段的左边字段的时候,索引才会被使用,使用符合索引遵循最左前缀集合

3.全文索引

全文索引,只有MyISAM存储引擎支持全文索引,只能在CHAR,VARCHAR,TEXT类型上使用全文索引,全文索引主要用来查找文本中的关键字,而不是直接与索引中的值相比较,在数据量较大时候,先将数据放入一个没有全文索引的表中,然后再用CREATE index创建fulltext索引,要比纤维一张表建立fulltext然后再将数据写入的速度快很多

4.空间索引

空间索引是对空间类型的字段建立的索引,MySQL中的空间数据类型有四种:GEOMETRY,POINT,LINESTRING,POLYGON
在创建空间索引时,使用SPATIAL关键字
空间索引必须使用MyISAM存储引擎,并且空间索引的字段必须为非空
以上的介绍针对索引的一些概念及索引的使用原则和分类做了简单的介绍,而我们使用索引的时候,更多的关注索引是可以让查询速度变快的这样一个数据结构,那么索引为什么会让查询速度变快呢,这里就要说到一种数据结构,B+树了。
B+树,B树和B*树其实大体上来讲都差不多,但是其不同的细节设置决定了B+树作为索引的数据结构是一种非常好的选择。
我们知道,再HashMap的数据结构中,这种数组+链表的数据结构中,当链表的长度超过8的时候,会变成红黑树,而红黑树,就是二叉树的一种,树这种数据结构,天生就适合搜索,这是毋庸置疑的,而制约二叉树的搜索效率因素就是树高,所以,这里的B树,就是一种名叫多路平衡搜索树的数据结构。
关于B树,我会在后续的文章中详细的介绍,现在,我们来说聚簇索引和非聚簇索引
平时,我们使用Mysql数据库,会为主键建立一个B+树索引,当我们基于主键搜索的时候,比如“where id = 666”,这时候,就会用到索引,将文件最终的存放地址找出来并加载,而当我们使用没有建立索引的字段进行搜索的时候,比如“where parm = ’笑笑笑笑笑笑笑笑笑‘”,这样子的,就不会用到索引。
聚簇索引就是当我们为不是主键的字段建立索引的时候,在这个索引B+树结构的叶子结点中,并不会想主键索引那样存储行数据,而是存储了主键的信息,找到主键之后,在通过主键索引查找出数据来
非聚簇索引就是为这个不是主键的字段建立了索引,并且B+树的叶子节点最终保存了数据的行信息,可以通过这个索引直接获取行数据,而不必在通过主键索引查找数据
Mysql5.7之后默认的存储引擎是InnoDb,InnoDb的索引是聚簇索引。
聚簇索引和非聚簇索引有他们各自的优缺点,聚簇索引的优点就是数据发生变化的时候,不用再去维护非主键索引了,因为存储的知识主键的信息,由于行数据和叶子节点存储在一起,主键和行数据是一起被载入内存的,找到叶子节点就可以立刻返回数据咯。