博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【原创】InnoDB 和TokuDB的读写分析与比较
阅读量:6119 次
发布时间:2019-06-21

本文共 2741 字,大约阅读时间需要 9 分钟。

hot3.png

我们知道,在MySQL单机版本里面最流行的也是唯一支持全事务的引擎为INNODB。 其特点是数据本身是用B-TREE来组织,数据本身即是庞大的根据主键聚簇的B-TREE索引。 所以在这点上,写入速度就会有些降低,因为要每次写入要用一次IO来做索引树的重排。 特别是当数据量本身比内存大很多的情况下,CPU本身被磁盘IO纠缠的做不了其他事情了。  这时我们要考虑如何减少对磁盘的IO来排解CPU的处境,那么如何做呢? (当然,如果数据足够放到内存里面,这些事情大可不必考虑。)

1. 可以把INNODB 个PAGE增大?(默认16KB)但是增大也就带来了一些缺陷。 比如,对磁盘进行CHECKPOINT的时间将延后。

2. 把日志文件放到更快速的磁盘上?比如SSD?

其实这时,我们可以考虑用另外一个知名的引擎TokuDB。 谁叫MySQL 天生支持随意可插拔呢!

TokuDB 其实本身数据存储用到了B-TREE的变形版本Fractal-Tree。 Fractal-Tree 也就是在B-Tree原来的非叶子节点增加了一个缓存,无论对这个树怎么操作,都是一个模式:即父亲节点的缓存满了,就流淌到儿子节点,然后儿子节点的缓存满了后,再次流淌到孙子节点等等一系列最后到了叶子节点,然后等到叶子节点的PAGE足够大的时候,进行CHECK POINT。当然不管如何做缓存,每次事务后,还是得首先刷新到REDO 日志,要不数据一致性就很难保证了。

接下来,这里测试下同样的环境InnoDB和TokuDB的性能差异。当然,我没有做压力测试,只是简单的手动执行了几次SQL而已。

(5.6.10-enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial))

用来导入的文件大概为35M。

1. INNODB.对应的参数: innodb_buffer_pool_size=32M bulk_insert_buffer_size=20M query_cache_size = 0导入性能:(InnoDB在这里慢在CPU一直忙于IO置换。)mysql> load data infile '/tmp/t3_push.csv' into table t3_push;Query OK, 955527 rows affected (30 min 44.03 sec)Records: 955527  Deleted: 0  Skipped: 0  Warnings: 0读性能:(读的性能还是很好的,这里用到5.6的ICP以及MRR特性。)mysql> select count(*) from t3_push where rank1 < 20 and rank2 < 30;       +----------+| count(*) |+----------+|       49 |+----------+1 row in set (0.06 sec)调大innodb_buffer_pool=128Mmysql> load data infile '/tmp/t3_push.csv' into table t3_push;Query OK, 955527 rows affected (38.72 sec)Records: 955527  Deleted: 0  Skipped: 0  Warnings: 0调大后,其实导入性能还是不错的。

2. TokuDB.(5.5.30-tokudb-7.1.0-e-log TokuDB Enterprise Server (GPL) )对应的参数: tokudb_cache_size=32M tokudb_loader_memory_size=20M query_cache_size = 0写性能:(这里IO次数很少,所以导入速度很快。)mysql> load data infile '/tmp/t3_push.csv' into table t3_push;Query OK, 955527 rows affected (19.73 sec)Records: 955527  Deleted: 0  Skipped: 0  Warnings: 0读性能:(读的速度比INNODB稍微慢了些。)mysql> select count(*) from t3_push where rank1 < 20 and rank2 < 30;  +----------+| count(*) |+----------+|       49 |+----------+1 row in set (0.54 sec)mysql> select count(*) from t3_push where rank1 < 200 and rank2 < 300;       +----------+| count(*) |+----------+|     5759 |+----------+1 row in set (4.13 sec)但是TokuDB可以给二级索引变聚簇,所以这点上如果只读的话,还是会比InnoDB快。给列rank2 加聚簇索引,mysql> alter table t3_push add clustering index idx_rank2(rank2);Query OK, 0 rows affected (6.79 sec)Records: 0  Duplicates: 0  Warnings: 0现在所有的基于索引idx_rank2 的查询都是瞬间的。mysql> select count(*) from t3_push where rank1 < 20 and rank2 < 30;+----------+| count(*) |+----------+|       49 |+----------+1 row in set (0.00 sec)mysql> select count(*) from t3_push where rank1 < 200 and rank2 < 300;       +----------+| count(*) |+----------+|     5759 |+----------+1 row in set (0.01 sec)

本文出自 “” 博客,请务必保留此出处

转载于:https://my.oschina.net/u/585111/blog/219476

你可能感兴趣的文章
python 3 处理HTTP 请求的包
查看>>
linux----->shell高级编程----1
查看>>
shell脚本检查网站状态
查看>>
3.1 文件管理命令
查看>>
mysql排名语句
查看>>
nginx的日志格式
查看>>
2-8. LDAP 网络用户账户
查看>>
Chrome HSTS异常导致无法访问HTTPS网页
查看>>
在apache2.2 php5.3.6 mysql5.5下出现#1366号mysql错误解决办法
查看>>
Provisioning Services 7.6 入门到精通系列之五:PVS控制台安装
查看>>
python学习笔记二 列表、字典、集合
查看>>
TCP/IP链接的三次握手与四次挥手
查看>>
Samba平台搭建和用户自行修改密码环境搭建笔记
查看>>
TCP三次握手和四次挥手全过程及为什么要三次握手解答
查看>>
对象模型向数据库表的映射规则
查看>>
dwz中保存数据后回调如何添加自己的回调方法
查看>>
配置bind缓存服务器
查看>>
怎么能让json_decode解析带斜杠的字符串
查看>>
Oracle 导出 ASH的dump信息
查看>>
php 操作数组 (合并,拆分,追加,查找,删除等)
查看>>