Mysql存储引擎之TokuDB以及它的数据结构Fractal tree(分形树)

在目前的Mysql数据库中,使用最广泛的是innodb存储引擎。innodb确实是个很不错的存储引擎,就连高性能Mysql里都说了,如果不是有什么很特别的要求,innodb就是最好的选择。当然,这偏文章讲的是TokuDB,不是innodb,相比innodb,TokuDB有着自己的特点。

BTree和Fractal tree的比较:

目前无论是SQL Server,还是MySQL的innodb,都是用的B+Tree(SQL Server用的是标准的B-Tree)的索引结构。从理论上来说,这个结构在查询过程中应该是不会慢的,此类基于比较的数据结构查询复平均杂度都是logn。B类树就是对于这个进行了优化,让它更适应磁盘,降低树的深度。

随机IO几乎是令所有DBA谈虎色变的一个问题,当数据量小的时候,所有数据都能到内存中那就没有这个问题(其实这个时候也就没有必要用B-Tree的这种块结构了),但是一旦数据量大于内存的话这个问题就出现了。其实从本质来说,k-v存储要解决的问题就是这么一个:尽可能快得写入,以及尽可能快的读取。

这也是设计数据结构时考虑最多的问题,在分析解决方法之前,我们讨论几个极端。走一个极端的话,如果我每次写数据都顺序写,那么对Insert来说的话是最快的,但是每次Query就需要Scan一遍整个表。那么如果我想获取最佳的读性能,那么方法就是像B-Tree那样全部排个序呗。但是因为B-Tree有那样的随机IO,这样我们有没有办法得到顺序写的写性能,

所以,TokuDB中使用了一个称之为Fractal tree(分形树)的索引结构来解决随机IO的问题。它主要是能让随机IO变成顺序IO。

Structure Inserts Point Queries Range Queries
B-Tree Horrible Good Good (young)
Append Wonderful Horrible Horrible
Fractal Tree Good Good Good

Fractal tree(分形树)简介

我们假设有这样一种集合的结构,相邻行空间加倍。每一行要么全满要么全空,全满行的数据都是排好序的。

数据插入:

以上图的数据存储状态为例,如果再写一个值的时候,会写在第一行,比如写了3,这个时候第一行是空的,所以就放到第一行。

再写一个值11的时候,因为第一行已经写满了,所以将3取出来,和11做排序,尝试写第二行。

又因为第二行也满了,所以将第二行的5和10也取出,对3,11,5,10进行排序。写入第三行。

最后的结果:

总体来看:

可以看出,这个数据结构能保证数据块都是满的。如果前面都满了,就会一层层合并下去,直到找到可以写入的块。

没明白的:

插入复杂度为O(log(N)/B),B是一个块存储的数据行数,N是数据量。但是我只想到O(N/B)的复杂度。据说是进行了优化得到的,不过没看懂。

提一下:BTree的复杂度为O(log(N)/log(B)),这是树的深度。B其实就是树的度,树的度越大,深度越低,成对数关系。

总结下Fractal Tree结构特点

  • 由多个有序的数组构成,大小呈指数级增长
  • 数组要么全空,要么全满
  •  数据插入到最小的数组,如果空间不够就将数据进行Merge

查询性能:

如果不进行优化,查询性能并不好。我们需要扫描每一层,最坏情况下IO次数达 log2N。

为了提高查找的性能,TokuDB在每个数据上加了一个forwardpointer,指向下一行中第一个比它大的数据的位置(这个叫做Fractional Cascading)。平均地看,上一级的每个数都把下一级搜索范围限制到了常数个,所以磁盘IO的次数最差应该为O(logN)。

 

 

看到的另一种优化办法:

 总结:

TokuDB主要的优点在于把随机的IO转换成顺序的IO写入。因此获得很好的写入速度,也因为这个,有很好的数据压缩效果。但如果是顺序写入,性能不如BTree。

因此,它适用于存档,大量随机插入的场景。

整个分形树设计感觉有点像二进制优化的逆向处理。是个挺有意思的数据结构。

参考资料:

How TokuDB Fractal Tree Databases Work Presentation

转载请注明:旅途@KryptosX » Mysql存储引擎之TokuDB以及它的数据结构Fractal tree(分形树)

时间: 2024-11-29 08:31:19

Mysql存储引擎之TokuDB以及它的数据结构Fractal tree(分形树)的相关文章

mysql dba系统学习(21)mysql存储引擎InnoDB

mysql存储引擎InnoDB 1,主体系结构: 默认7个后台线程,4个io thread(insert buffer.log.read.write),1个master thread(优先级最高),1个锁(lock)监控线程,1个错误监控线程.可以通过show engine innodb status来查看.新版本已对默认的read thread和write thread分别增大到4个,可通过show variables like 'innodb_io_thread%'查看. 存储引擎组成: 缓

mysql dba系统学习(20)mysql存储引擎MyISAM

mysql存储引擎MyISAM 1,创建myisam表 mysql> create table t (id int , name varchar(30) , msg varchar(100)) engine = MyISAM; mysql> show table status like "t" \G ; *************************** 1. row *************************** Name: t Engine: MyISAM

如何选择合适的MySQL存储引擎

MySQL有多种存储引擎: MyISAM.InnoDB.MERGE.MEMORY(HEAP).BDB(BerkeleyDB).EXAMPLE.FEDERATED.ARCHIVE.CSV.BLACKHOLE. MySQL支持数个存储引擎作为对不同表的类型的处理器.MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎: ◆ MyISAM管理非事务表.它提供高速存储和检索,以及全文搜索能力.MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另外一个

Mysql存储引擎InnoDB和Myisam的六大区别

 这篇文章主要介绍了Mysql存储引擎InnoDB和Myisam的六大区别,本文从构成上.事务处理.SQL操作.自动ID.表行数等方面讲解了它的区别,需要的朋友可以参考下       MyISAM InnoDB 构成上的区别:     每个MyISAM在磁盘上存储成三个文件.第一个文件的名字以表的名字开始,扩展名指出文件类型.   .frm文件存储表定义. 数据文件的扩展名为.MYD (MYData). 索引文件的扩展名是.MYI (MYIndex).   基于磁盘的资源是InnoDB表空间数据

《MySQL技术内幕:InnoDB存储引擎第2版》——1.3 MySQL存储引擎

1.3 MySQL存储引擎 通过1.2节大致了解了MySQL数据库独有的插件式体系结构,并了解到存储引擎是MySQL区别于其他数据库的一个最重要特性.存储引擎的好处是,每个存储引擎都有各自的特点,能够根据具体的应用建立不同存储引擎表.对于开发人员来说,存储引擎对其是透明的,但了解各种存储引擎的区别对于开发人员来说也是有好处的.对于DBA来说,他们应该深刻地认识到MySQL数据库的核心在于存储引擎. 由于MySQL数据库的开源特性,用户可以根据MySQL预定义的存储引擎接口编写自己的存储引擎.若用

mysql存储引擎

Innodb存储引擎   Innodb存储引擎支持事务,其设计目标主要面向在线事务处理(OLTP)的应用.其特点是行锁设计.支持外键,并支持类似于Oracle的非锁定读,即默认读操作不会产生锁.   Innodb存储引擎将数据放在一个逻辑的表空间中,也可以单独放到一个独立的ibd文件中.此外,还支持用裸设备(row disk)来建立其表空间.   Innodb通过多版本并发控制(MVCC)来获得高并发性,并且实现了SQL标准的4种隔离级别,默认为RR级.同时,使用一种被称为netx-key lo

Sphinx全文检索引擎使用指南:MySQL存储引擎

6.1. SphinxSE概览 SphinxSE是一个可以编译进 MySQL 5.x版本的MySQL存储引擎,它利用了该版本MySQL的插件式体系结构.SphinxSE不能用于 MySQL 4.x系列,它需要MySQL 5.0.22或更高版本:或 MySQL 5.1.12或更高版本. 尽管被称作"存储引擎",SphinxSE自身其实并不存储任何数据.它其实是一个允许 MySQL服务器与searchd交互并获取搜索结果的嵌入式客户端.所有的索引和搜索都发生在 MySQL之外. 显然,Sp

如何选择合适的MySQL存储引擎_Mysql

MySQL支持数个存储引擎作为对不同表的类型的处理器.MySQL存储引擎包括处理事务安全表的引擎和处理非事务安全表的引擎: ◆ MyISAM管理非事务表.它提供高速存储和检索,以及全文搜索能力.MyISAM在所有MySQL配置里被支持,它是默认的存储引擎,除非你配置MySQL默认使用另外一个引擎. ◆ MEMORY存储引擎提供"内存中"表.MERGE存储引擎允许集合将被处理同样的MyISAM表作为一个单独的表.就像MyISAM一样,MEMORY和MERGE存储引擎处理非事务表,这两个引

基于Mysql存储引擎的深入分析_Mysql

MySQL有很多种存储引擎,针对不同的应用,可以为每张表选择合适的存储引擎,这样有助于提升MySQL性能.创建新闻表news: 复制代码 代码如下: CREATE  TABLE `sandbox`.`news` (      `id` INT NOT NULL AUTO_INCREMENT ,      `name` VARCHAR(45) NULL ,          `content` VARCHAR(45) NULL ,      `created` VARCHAR(45) NULL ,