mysql 索引的原理

mysql 索引的原理
数据量很大的时候
1.平衡二叉树
第一,我们一个表中的数据存储量会很大,数据量在万以内的我们都认为这是个小数据量表,一般的表数据量都以十万计,百万级别的表也不在少数,用二叉树来索引的话,这个树就会是个很高很瘦的树,层次很深,查找的次数会有几十次次之多。
第二,因为数据量很大,相应的索引也会很大,不可能全部存储在内存中,数据库是做数据持久化的地方,索引文件不可能永驻内存,因此索引往往以索引文件的形式存储的磁盘上,
这样。索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。
这样磁盘存取也成为我们在设计索引时必须要考虑的主要因素之一。在这里插入图片描述

2.B数
综上所述,有没有一种既可以避免二叉树这种搜寻深度过深,又可以充分利用磁盘预读原理的数据结构呢。这个就是B树了。
B树中一个节点可以允许有多个子节点,在实际使用时,一个B树节点的实际大小一般设为一个4K大小的页,这样每个节点只需要一次I/O就可以完全载入。
同时,B树的每个节点有多个key,并且以升序排列。这样在查找时就很方便了。
大家可以从图上看到,存储了27个数据,允许7个子节点的B树的层次比存储了20个数据的平衡二叉树要少,数据越多,层次相对于平衡二叉树就越少,而且B树的允许的子节点个数越多,这个B树也就层次越少。
在硬盘上实际存储B树时,一个B树节点的实际大小一般设为一个4K大小的页,所以B树的允许子节点都非常大(通常在100到1000之间),所以即使存储大量的数据,B树的高度仍然比较小。
每个结点中存储了关键字(key)和关键字对应的数据(data),以及孩子结点的指针。我们将一个key和其对应的data称为一个记录。但为了方便描述,除非特别说明,后续文中就用key来代替(key, value)键值对这个整体。在数据库中我们将B树
(和B+树)作为索引结构,可以加快查询速速,此时B树中的key就表示键,而data表示了这个键对应的条目在硬盘上的逻辑地址
在这里插入图片描述

3.B+树
Mysql等数据库系统实际使用的则是B+树,B+树是B-树的变体,其定义基本与B-树相同,主要的不同点在于:
1、所有的非叶子节点上不包含数据信息,因此在内存页中能够存放更多的key,所有数据(或者说记录)都保存在叶子结点中。
2、叶子结点都是相链的,因此对整棵树的遍历只需要一次线性遍历叶子结点即可
在这里插入图片描述

Mysql索引的实现
	MyISAM
		使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址,这里设表一共有三列,假设我们以Col1为主键,
		可以看出MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何
		区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。如果我们在Col2上建立一个辅助索引,同样也是一颗B+Tree,
		data域保存数据记录的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,
		则取出其data域的值,然后以data域的值为地址,读取相应数据记录。MyISAM的索引方式也叫做“非聚集”的。
	InnoDB
		也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。
		第一个重大区别是InnoDB的数据文件本身就是索引文件。从上文知道,MyISAM索引文件和数据文件是分离的,
			索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,
			这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。
			叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,
			所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个
			可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,
			这个字段长度为6个字节,类型为长整形。
		第二个与MyISAM索引的不同是InnoDB的辅助索引data域存储相应记录主键的值而不是地址。
			换句话说,InnoDB的所有辅助索引都引用主键作为data域
			聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:
			首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值