搞懂mysql索引分类及使用B+树的原因

什么是索引

1)索引就好比一本书的目录,它能让你更快的找到自己想要的内容。
2)让获取的数据更有目的性,从而提高数据库检索数据的性能。

索引的目的和优缺点

目的:在进行一些查询的时候提高查询效率。
优点:可以提高数据检索的效率,降低数据库的IO成本,可以加速表和表之间的连接,在使用分组和排序子句进行数据检索时,降低数据排序的成本,降低了CPU的消耗
缺点: 索引会占据磁盘空间,会降低表的增删改的效率,因为每次增删改索引需要进行动态维护

索引的分类

1.主键索引

设定为主键后数据库会自动建立索引,innodb为聚簇索引,不能为空值,必须是唯一值
在这里插入图片描述

2. 普通索引

即一个索引只包含单个列,一个表可以有多个普通索引,最多可以创建16个普通索引。
在这里插入图片描述

3.唯一索引

索引列的值必须唯一,但允许有空值
在这里插入图片描述

4.联合索引

即一个索引包含多个列,在数据库操作期间,联合索引比普通索引所需要的开销更小(对于相同的多个列建索引),当表的行数远大于索引列的数目时可以使用联合索引,但是在执行查询操作的时候,要遵循最左匹配原则
在这里插入图片描述

5.全文索引

只能在文本类型CHAR,VARCHAR,TEXT类型字段上创建全文索引。字段长度比较大时,如果创建普通索引,在进行like模糊查询时效率比较低,这时可以创建全文索引。 MyISAM和InnoDB中都可以使用全文索引。

6.空间索引

空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON。MYSQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引。创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MYISAM的表中创建

7.前缀索引

前缀索引是指对字符类型字段的前几个字符或对二进制类型字段的前几个bytes建立的索引,而不是在整个字段上建索引。前缀索引可以建立在类型为char、varchar、binary、varbinary的列上,可以大大减少索引占用的存储空间,也能提升索引的查询效率。

索引的数据结构

1.hash表

可以参考HashMap的数据结构,基于Key-Value,Hash表在等值查询时效率很高,时间复杂度为O(1);但是不支持范围快速查找,范围查找时还是只能通过扫描全表方式。 现在一般不推荐使用hash表的数据结构,因为存储的数据是散列存放的,不支持范围查询

2.二叉树

特点:每个节点最多有2个分叉,左子树和右子树数据顺序左小右大
如图:左边的图是理想情况下,可以有效的减少磁盘的IO操作,但是在右边的情况下,磁盘的IO操作并没有减少。
在这里插入图片描述

3.平衡二叉树

特点:树的左右两个子树的层级最多相差1
如图: 当数据量比较小的时候,树的高度也不高,可以有效的减少磁盘IO,加入我们现在查询012,只需要两次磁盘操作就可以查询到。但是当数据量大的时候,加入上百万的数据,树的高度就比较高了,磁盘的IO操作就会多,效率自然而然就会变低。
在这里插入图片描述

4.B树

特点:B树的节点中存储着多个元素,每个内节点有多个分叉。
节点中的元素包含键值和数据,节点中的键值从大到小排列。也就是说,在所有的节点都储存数据。
父节点当中的元素不会出现在子节点中。所有的叶子结点都位于同一层,叶节点具有相同的深度,叶节点之间没有指针连接。
缺点:不支持范围的快速查找。
如图:来源于网络,
在这里插入图片描述

5.B+树

特点:节点的子树数和关键字数相同(B 树是关键字数比子树数少一)节点的关键字表示的是子树中的最大数,在子树中同样含有这个数据叶子节点包含了全部数据,同时符合左小右大的顺序
只有叶子节点才会存储数据,非叶子节点至存储键值。叶子节点之间使用双向指针连接,最底层的叶子节点形成了一个双向有序链表
优点:B+树可以保证等值和范围查询的快速查找,MySQL的索引就采用了B+树的数据结构
在这里插入图片描述

mysql 的存储引擎介绍

MyISAM

特点:它不支持事务,也不支持外键,尤其是访问速度快,对事务完整性没有要求或者以SELECT、INSERT为主的应用基本都可以使用这个引擎来创建表。

每个MyISAM在磁盘上存储成3个文件,其中文件名和表名都相同,但是扩展名分别为:
.frm(存储表定义)
MYD(MYData,存储数据)
MYI(MYIndex,存储索引)
frm和MYI可以存放在不同的目录下。MYI文件用来存储索引,但仅保存记录所在页的指针,索引的结构是B+树结构。下面这张图就是MYI文件保存的机制:
在这里插入图片描述

InnoDB

(1)可以通过自动增长列,方法是auto_increment。
(2)支持事务。默认的事务隔离级别为可重复度,通过MVCC(并发版本控制)来实现的。
(3)使用的锁粒度为行级锁,可以支持更高的并发;
(4)支持外键约束;外键约束其实降低了表的查询速度,但是增加了表之间的耦合度。
(5)配合一些热备工具可以支持在线热备份;
(6)在InnoDB中存在着缓冲管理,通过缓冲池,将索引和数据全部缓存起来,加快查询的速度;
(7)对于InnoDB类型的表,其数据的物理组织形式是聚簇表。所有的数据按照主键来组织。数据和索引放在一块,都位于B+数的叶子节点上;

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值