B树,B树谁主沉浮Mysql优化

小编上文提及了几种数据结构都不能很好的成功担任Mysql索引结构,那么谁又是Mysql那个心仪已久的白马王子呢?且看B-树和B+树决战紫晶之巅。红黑树因为本身的树高问题,I/O多长效率不高,那么是否有一种可以再树每个节点存储多个元素,就可以解决问题呢,对他就是B-树。1、B_树数据结构红黑树结构如图:那么每个节点存最大三个,第四产生转换红黑树结构图B-树三个元素图4个元素图当每个大节点超过节点容量时发生转换。最终结果图如下相比较红黑树他的高度只有2,查询速度更快。B-树因此具有以下几个特点:1)、叶节点具有相同的深度,叶节点的指针为空2)、所有索引元素不重复3)、节点中的数据索引从左到右递增排列看完数据结构,我们看B树做索引的结构又如何呢,mysql默认索引节点为16KB,当然可以修改大小。mysql的默认节点大小B_树索引算法的结构如下B树存储图可以看到每个数字代表一个索引(15,16指针等),后面空格代表叶子节点指针,那么可以看到每个元素包含索引和元素代表的data数据(data可能是指针地址,也可能是数据),那么按照1KB一行数据算一个节点就只能存不到16个元素。这样的话数据的量级别又大打折扣。那么有没有更优秀的数据结构呢?2、B+树(成功被宠幸的那一位)B+树一个B_的变种,成功解决树高,和访问的结构。B+树B+树数据结构中每个节点只存索引和下一个节点指针,最后子节点存数据加索引:下面以主键做例子:比如主键使用bigint数据类型是8b,指针占6b,大小就是14b,那么16kb所有存满一个节点就是16*/14=,也就是个索引加个下一节点指针。以图三层来算,三层高的树将存储:**16达到了两千万级别的数据量。那么为什么是16呢?因为我们每个data+索引假设为比较大数据的1KB来算的,要是更小的话数据级别将更大。(为何有15,20重复出现,应为右边索引大于等于左边)同时B+树在最后一层每个节点之间加入指针,做出了双向的指针。为何这么设计呢?那就是为了解决前面hash表中的不支持的范围查找。表创建索引的类型比如我用了20时自己的节点处理完之后,没有指针的话就又的从根节点去查找,指针可以根据节点的右边大于等于左边,同时头尾都指针连接,20也直接使用。Mysql底层B+树结构最终B+树不出出谁与争锋。且看下次他如何笑傲MyISAM索引和InnoDB索引。也看看为什么InnoDB表必须有主键,并且推荐使用整型的自增主键?为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间)。mysql可以每个表都设置不同的存储引擎:大概分类一、InnoDB这是MySQL5.5或更高版本的默认存储引擎。它提供了事务安全(ACID兼容)表,支持外键引用完整性约束。它支持提交、回滚和紧急恢复功能来保护数据。它还支持行级锁定。当在多用户环境中使用时,它的“一致非锁定读取”提高了性能。它将数据存储在集群索引中,从而减少了基于主键的查询的I/O。二、MyISAM该存储引擎管理非事务性表,提供高速存储和检索,支持全文搜索。三、MEMORY提供内存中的表,以前称为堆。它在RAM中处理所有数据,以便比在磁盘上存储数据更快地访问。用于快速查找引用和其他相同的数据。四、MERGE将多个类似的MyISAM表分组为一个表,可以处理非事务性表,默认情况下包括这些表。五、EXAMPLE你可以使用此引擎创建表,但不能存储或获取数据。这样做的目的是教开发人员如何编写新的存储引擎。六、ARCHIVE用于存储大量数据,不支持索引。七、CSV在文本文件中以逗号分隔值格式存储数据。八、BLACKHOLE受要存储的数据,但始终返回空。九、FEDERATED将数据存储在远程数据库中。


转载请注明:http://www.aierlanlan.com/grrz/8394.html