赞
踩
二叉搜索树定义:
平衡二叉(avl)树定义:
虽然avl树对于二叉树来说是平衡了降低了树的高度,虽然提高了性能,但是数据量大一点的时候,高度依旧很高。毕竟定义一摆在那,非叶子节点怎么找最多也只能有俩个子节点,故不推荐。
b-树定义:
在一个节点中,存放着数据(包括key和data)以及指针,且相互间隔。
同一个节点,key增序。
一个节点最左边的指针不为空,则它指定的节点左右的key小于最左边的key。右边同理。中间的指针指向的节点的key位于相邻两个key的中间。
B-Tree中不同节点存放的key和指针可能数量不一致,但是每个节点的域和上限是一致的,所以在实现中B-Tree往往对每个节点申请同等大小的空间。
每个非叶子节点由n-1个key和n个指针组成,其中d<=n<=2d。
简单点来说呢,b-树又称多路查找树相对于avl树来说就是每个节点下面可以有多个分叉。至少多于2个叉撒,对于百万级别的数据又是降低了树的高度,虽然提高了性能,但是由于每个索引节点都有存放
data域的指针,而我们计算机每次从磁盘读取数据时以页(4kb)为单位,每次读取4096byte的数据,导致读取单个节点时,可能由于节点过大,每次读出的数据有限,从而增大io次数,故在mysql这种关系型数据库中不推荐。但是b-树还是有它自己的优点的,如果查找的节点,离根节点很近那么查找的效率还是很高的
b+树定义:
b+树相对与b-树来说好的地方就是:
索引定义:一种数据结构
按照范围从大到小来说吧,最大的是聚簇索引、非聚簇索引。接着是我们常说的b-tree索引、hash索引,而我们的覆盖索引、前缀索引、组合索引、复合索引、全文索引是基于b-tree、hash索引来说的,还有的就是Innodb引擎独有的自适应哈希索引下面一一展开了来说。
聚簇索引定义:是一种存储数据的方式,数据与索引在一个文件中。它的辅助索引的叶子节点存储的是指向行的指针。
一般来说innodb是按照主键来进行聚集的,这就意味着被索引的列就是主键列。如果主键不存在,其次就是按照非空唯一性约束来进行聚集,如果这个约束都没得,其次就是按照Innodb它自己生成的一个隐藏主键列来聚集。那么使用聚簇索引有什么优缺点吗?当然是有的。
如果我们往聚簇索引中插入非顺序的数据时的情况下面
非聚簇索引是什么呢?其实我们所说的辅助索引、第二索引啊啥的其实可以理解为就是非聚簇索引。非聚簇索引就是叶子节点的data域中存的不是完整的数据,而是指向磁盘数据的指针。
定义:单列索引的组合。我感觉和覆盖索引没啥差别,假设现在有一张表(test)有a,b,c,d,e这么几个字段,其中我们为a,b,c列添加一个索引叫a_b_c,这个就是组合索引。
定义:索引列已经包含了我们需要查询的数据。其实就是组合索引(复合索引)在特定情况下的又一别称。假设现在有一张表(test)有a,b,c,d,e这么几个字段,其中我们为a,b,c列添加一个索引叫a_b_c,现在select a,b,c from test where a = x1 and b = x2 and c = x3;我们需要查询的数据在辅助索引上面已经有了,此时使用的就是复合索引。
定义:为数据的前面几个字段创建的索引。我个人理解其实就是单列索引的变种。那为什么要为前几个字符创建索引而不是为其全部来创建索引呢?原因也是很简单,这个得结合应用场景来说了。现在有这么一张表,专门是存储家庭地址的,一个地址动不动就是十来个字的长度,如果我们以全部长度来创建索引,那么这个索引文件是超级的大啊。此时创建前缀索引是个不错的选择,可以大幅度压缩索引的大小,那么我们该如何确定前缀索引的长度的呢?这就是涉及到一个算法了。
不重复的索引值/所有行 = 比值,这个比值接近7的时候,所得到的结果就会越加精确。
使用的场景:一些读操作密集的表建议使用hash索引,因为hash索引的查找速度是很快的。但是也有一些局限。
hash索引的局限性:
底层数据结构b+tree,对比hash的局限来看,hash索引的局限在b-tree索引这都不是事,除了hash索引查询速度快这点上面
与其说这是一种索引不如称其为是一种机制。自适应哈希索引的由来就是:当Innodb注意到一些索引值被频繁的访问时,内部会在b-tree索引的顶端为其创建索引保存在内存之中,使其具有快速哈希查找的特性,这个过程是它自动完成的
关注不迷路,日后分享更多技术干货,B站、CSDN、微信公众号同名,名称都是(小咸鱼的技术窝)更多详情在主页
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。