MySQL中的索引(包含B+树的数据结构)

1.什么是索引

索引是一种特殊的文件,包含着对数据表里所有记录的引用,可以对表中的一列或者多列创建索引;本质上来说索引就相当于"书的目录",索引的引入就是为了加快数据库查找操作的效率

2. 索引的优缺点

优点:

为了加快数据库查找操作的效率(也是索引最重要的作用)

缺点:

  1. 索引提高了增,删,改的开销,因为每次进行增删改操作时都需要修改对应记录的索引(即调整已经创建好的索引);

  1. 索引提高了空间的开销,因为每条记录都对应一个索引,需要额外的硬盘空间来保存索引

由于对数据库进行操作时(增删改查),在多数场景中,查询操作的使用频率往往要远高于增删改操作,所以合理的对相应字段创建索引会提高操作效率!

3.索引的使用场景

当我们在对数据表的某列或者某几列创建索引时,需要考虑一下几点:

  1. 如果数据量较大,且频繁的对这些列进行条件查询时需要创建索引

  1. 如果对数据表和这些列的插入,修改操作较为频繁时,则不需要创建索引

  1. 如果索引占用的磁盘空间较大或者磁盘空间不允许的情况下,也不需要创建索引

4.索引的使用

在不创建索引的情况下,也会自动创建(前提是创建的是主键约束(primary key),唯一约束(unique),外键约束(foreign key))

1.查看索引

show index from 表名;

创建了一个student表,对id字段设置了主键约束,会自动生成索引,所以在查看索引时可以发现,字段id列创建了索引;

2.创建索引

对于非主键、非唯一约束、非外键的字段,可以创建普通索引
create index 索引名 on 表名(字段名);

现在我们对刚才的student表的name字段创建一个索引:

MySQL中的索引(包含B+树的数据结构)_第1张图片

3.删除索引

drop index 索引名 on 表名;

现在我们把刚才name字段的索引给删除掉:

4.总结

  1. 不论是创建索引还是删除索引都是十分危险的操作,因为当表中数据很多或者有很多表时,创建和删除索引就会吃掉打量的磁盘IO,需要花费很长时间,在这段时间内,数据库是无法正常使用的,所以我们最好是在设计数据库的时候创建好索引;

  1. 加上索引是为了加快查找的速度,但是并不是所有的情况上加上索引就一定会快,如果该列的重复项过多(如学生表中的性别);

  1. 索引创建好之后,不需要手动使用,查询的时候会自动按照索引来查,可通过explain关键字来查询索引的具体使用情况.

5.MySQL中索引使用的数据结构

数据库查找核心:
1.查找效率要高
2.要支持范围查找

1.哈希表

哈希表的查找时间复杂度:O(1),但是不支持范围查找,只能进行比较是否相等;

2. 二叉搜索树

二叉搜索树的时间复杂度是:O(N),最坏情况下是单支树,所以二叉搜索树十分依赖根节点的选取;最好情况是二叉平衡树,此时的时间复杂度是O(logN),所以树的高度决定了查询时元素的比较次数(每一次比较都会读写硬盘);

3.B树(N叉搜索树)

B树就是在二叉搜索树的基础上进行了优化,从原来的一个节点上存放一个数据优化成一个节点上存放多个数据,从而降低了读写硬盘的次数(因为每一次查找一个节点时就是读取一次硬盘,节点在硬盘上);

MySQL中的索引(包含B+树的数据结构)_第2张图片

此时B树满足了可以范围查找,同时一个节点上存放多个数据降低了书高,提升了查找效率,但是还不够,如果查找一个范围时,需要从根节点开始遍历两次,效率较低,那有什么办法只需要遍历一次树就够了呢?所以诞生了B+树(专门用来存储索引的数据结构).

4.B+树

MySQL中的索引(包含B+树的数据结构)_第3张图片

B+树的特点:

  1. B+树也是一个N搜索树,每个节点上可能包含N个key,N个key划分出N个区间,最后以一个key就相当于最大值了;

  1. 父元素的key会在子元素中重复出现,并且是以最大值的姿态出现

  1. 会把叶子结点用双链表的方式组织起来

B+树的优点:

  1. 作为一个N叉搜索树,高度降低了,比较的时候,硬盘的IO次数就减少了;

  1. 更适合进行范围查询,查询一个范围时先遍历B+树,查找到该数据在叶子结点的位置,然后再从该节点往后遍历链表查找另一个树,避免了二次遍历B+树(这点不同于B树);

  1. 非叶子节点只会记录部分数据(即设置索引的字段的数据),并不包含一条记录的全部数据,只有叶子节点才会包含,这样大大减少了数据的开销.

你可能感兴趣的:(MySQL学习,数据库,java,mysql)