我们知道,在mysql单机版本里面最流行的也是唯一支持全事务的引擎为innodb。其特点是数据本身是用b-tree来组织,数据本身即是庞大的根据主键聚簇的b-tree索引。
我们知道,在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 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 select count(*) from t3_push where rank1 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 select count(*) from t3_push where rank1
本文出自 “上帝,咱们不见不散!” 博客,请务必保留此出处