MySql数据库(一)--索引

前言:

        本文目的是总结在Mysql数据库学习的过程中的一些总结,以便日后翻阅。本文主要整理的是数据库索引、后面会整理一些其他的内容。索引做为数据优化的主要手段,很多解释是索引就像书本的目录一样,可以帮助我们快速查找到想要的数据,前提是查询的条件是增加了索引的字段。我们知道,对于数据库的每一次查找就是和磁盘的一次I/O交互,如果全表扫描的会,cpu会去依次查找每个物理地址,直到找到要查找的数据,因此,全表扫描是非常耗费时间和资源的。首先我们整理一下数据结构,了解索引存储的方式。

一、数据结构

     1、二叉树

       二叉树顾名思义,该数据结构就像是树一样,每个节点后面都可以产生两个分支,左边的分支“左树”比根节点小,右边的节点会比根节点大。相对于全表扫描二叉树的性能是有很大的提高,但是如果数据过多的话,二叉树的层级会比较深,二叉树查找也是比较消耗时间的。如何数据很不幸都是依次递增的,此时存到二叉树上的索引就是一个链表结构,会全部排在根节点的右边,此时的查询就相当于全表扫描。

链表结构的二叉树

 

2、平衡二叉树

       二叉平衡树也称AVL TREE,是在二叉树结构的改进,左右节点的深度绝对值不超过1AVL TREE会通过左旋或者右旋自动调节树的结构,来保证二叉树的左右平衡,从而避免出现这种链表式的结构。AVL TREE有效的降低了树的深度,但是对于大量的数据,树的深度也是未知的,树的每一层深度意味着一次I/O交互。同时,AVL TREE也没有解决一个范围查询的问题。对于红黑树来说,范围查询也是比较麻烦的。

 

3、B Tree(多路平衡查找树)

      对于红黑树的问题,我们可以采用扩展节点的横向数据量来减少树的深度。这样就明显减少了磁盘I/O的次数。

如果使用B Tree来保存索引,在保存索引的节点同时回保存数据,也就是在一个节点上同时保存索引和数据,这样数据量会占据一定的数据量,从而影响保存节点的个数。之后,就有了B+tree的出现。

4、B+Tree

       B+Tree是在B Tree的基础上进行改进,将根节点和子节点上的数据保存到叶子节点上,根节点和子节点只保存索引信息,这里提一下,不同的数据库引擎在此处的保存的数据会有差别,Innodb在叶子节点上保存了索引信息和相应的数据,在检索的时候可以直接根据索引找到想要的数据,MyIsam引擎保存的是索引和相应的磁盘地址,因此,检索数据的时候,需要根据索引对应的磁盘地址再去查找数据(回表)。对比B+Tree和B Tree会发现,叶子节点中的数据会有指针连接,可以提高区间的访问性能。

数据结构学习工具https://www.cs.usfca.edu/~galles/visualization/BTree.html

二、名词解释

1、聚集索引

              ----主键决定数据存放顺序。在Innodb中,主键就是聚集索引。

2、非聚集索引

            ------非聚集索引又可以称为二级索引、辅助索引,在Innodb中,在辅助索引的B+Tree叶子节点保存的是该索引对应的主键索引值。

3、回表

            ----在Innodb中,通过辅助索引来检索信息,先根据辅助索引找到对应的主键索引,再检索主键索引,找到其叶子节点保存的数据,这个过程叫回表,因此,通过辅助索引来检索数据,要多检索一棵B+Tree,效率要低。这里借用一张图:

4、联合索引及最左匹配原则

          ---多个字段共同组成的索引。联合索引的B+tree和辅助索引相似,辅助索引的节点保存的是单个索引,联合索引保存的是多个字段,根据联合索引来查询的时候,采用最左匹配原则,在检索的时候必须从第一个字段开始、且不能中断。

5、索引覆盖

         ----要查询的字段就是索引的字段,这样在检索索引树的时候,取到索引值之后不需要根据对应的ID值取查找主键索引树,即不需要回表,称为覆盖索引。

三、Sql优化

    1、select * from xxx,这样的语句不会产生覆盖索引,所有建议需要哪些字段写哪些字段;

    2、索引要在离散度高的列上面创建:离散度表示该列数据重复程度的比例,离散度高,及该列数据重复的数据少;

    3、不要在索引列使用函数、计算或者表达式;

    4、字符串不加引号,发生隐式转换;

     5、like查询,前面加% ,会违反最左匹配原则

    6、一些负向查询,NOT in、Not LIKE,大部分用不到索引,不是绝对;

最后:索引是否使用最终决定于Mysql的索引优化器。

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值