TokuDB引擎是有Tokutek开发的一个数据库存储引擎,在设计之初便引入了独特的索引算法,在其 官网 测试中, 文章 中看到TokuDB性能比InnoDB高出很多。

MySQL是一个插件式的数据库,在MySQL5.5版本之前MyISAM是MySQL的默认存储引擎,在之后的版本中默认的存储引擎变成了InnoDB。其特点是它支持事务,具有完善的崩溃恢复机制,具体的特点这里不说明,可以自行的寻找资料。这里介绍的TokuDB和InnoDB有很多相似之处:一个高性能,支持事务、MVCC、聚簇索引等。最大的不同在于TokuDB采用了一种叫做Fractal Tree的索引结构,使其在随机写数据的处理上有很大提升。一般来说数据库的索引结构都采用B+Tree或则类似的数据结构,InnoDB也是如此。InnoDB是以主键组织的B+Tree结构,数据按照主键顺序排列。对于顺序的自增主键有很好的性能,但是不适合随机写入,大量的随机I/O会使数据页分裂产生碎片,索引维护开销很多大。而TokuDB的Fractal Tree的索引结构很好的解决了这个问题。

TokuDB解决随机写入的问题得益于其索引结构,Fractal Tree 和 B-Tree的差别主要在于索引树的内部节点上,B-Tree索引的内部结构只有指向父节点和子节点的指针,而Fractal Tree的内部节点不仅有指向父节点和子节点的指针,还有一块Buffer区。当数据写入时会先落到这个Buffer区上,该区是一个FIFO结构,写是一个顺序的过程,和其他缓冲区一样,满了就一次性刷写数据。所以TokuDB上插入数据基本上变成了一个顺序添加的过程。

TokuDB另一个特点是压缩性能和低CPU消耗,TokuDB存储引擎默认的块大小是4M,这使其有更好的压缩效率。默认支持压缩功能,不需要配置其他的东西。压缩选项有:TokuDB_Quicklz、TokuDB_Lzma、TokuDB_Zlib,同时也支持非压缩选项。TokuDB_Zlib支持的默认压缩格式。一般压缩都需要消耗更多的CPU。但TukuDB消耗的CPU资源较少。

安装

为了方便安装,直接在percona版本的MySQL上安装TokuDB存储引擎。Ubuntu下apt安装percona MySQL: http://www.percona.com/doc/percona-server/5.6/installation/apt_repo.html

vi /etc/apt/sources.list.d/percona.list

deb http://repo.percona.com/apt trusty main

其他:添加其他软件的更新,和本次安装无关

vi /etc/apt/sources.list

deb http://mirrors.aliyun.com/ubuntu trusty main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu trusty-updates main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu trusty-security main restricted universe multiverse

源添加完毕之后更新:

apt-get update

最后apt安装percona MySQL:

apt-get install percona-server-server-5.6 percona-server-client-5.6

以上percona MySQL安装完毕,接着就开始安装TokuDB。

参考官网的安装说明: https://www.percona.com/doc/percona-server/5.6/tokudb/tokudb_installation.html

安装TokuDB的前提条件是需要支持jemalloc,需要关闭  Transparent huge pages,执行:

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

效果:

root@ptest:~# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
root@ptest:~# cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]

开始apt安装TokuDB:

root@ptest:~# apt-get install percona-server-tokudb-5.6

安装好检查:

root@ptest:~# ps_tokudb_admin --enable -uroot -p
Enter password:
Continuing without password...Checking if Percona server is running with jemalloc enabled...
grep: /proc/5440/environ: Permission denied
>> Percona server is running with jemalloc enabled.Checking transparent huge pages status on the system...
>> Transparent huge pages are currently disabled on the system.Checking if thp-setting=never option is already set in config file...
>> Option thp-setting=never is not set in the config file.
>> (needed only if THP is not disabled permanently on the system)Checking TokuDB plugin status...
>> TokuDB plugin is installed.Adding thp-setting=never option into /etc/mysql/my.cnf
>> Successfuly added thp-setting=never option into /etc/mysql/my.cnf   #把参数thp-setting=never加载到了my.cnf的[mysqld_safe]的选项组下

通过show engines、show plugins 查看存储引擎,是否安装成功,要是没有成功则检查上面是否有错误。要是通过show engines没有TokuDB,但通过show plugins有则需要手动install:

INSTALL PLUGIN tokudb SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_file_map SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_fractal_tree_info SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_fractal_tree_block_map SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_trx SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_locks SONAME 'ha_tokudb.so';
INSTALL PLUGIN tokudb_lock_waits SONAME 'ha_tokudb.so';

查看版本:

>SELECT @@tokudb_version;
+------------------+
| @@tokudb_version |
+------------------+
| tokudb-7.5.6     |
+------------------+

以上就完成了TokuDB的安装。详细信息请见 官网 。

测试:针对插入、压缩、存储引擎转换、事务、复制等日常用到的功能进行测试。

1)插入和压缩性能:压缩参数: tokudb_row_format

zjy@127.0.0.1 : test 10:58:58>show create table login_log_Toku\G;
*************************** 1. row ***************************Table: login_log_Toku
Create Table: CREATE TABLE `login_log_Toku` (`userID` varchar(255) NOT NULL,`tryIP` varchar(255) DEFAULT NULL,`tryTime` datetime DEFAULT NULL,`tryResult` tinyint(1) DEFAULT '0',`refferUrl` varchar(255) DEFAULT NULL,`sID` int(10) unsigned NOT NULL AUTO_INCREMENT,`authType` tinyint(1) DEFAULT '1',`type` tinyint(1) DEFAULT '1',`deviceType` varchar(64) DEFAULT '',PRIMARY KEY (`sID`),KEY `idx_tryip` (`tryIP`),KEY `idx_userid` (`userID`),KEY `idx_tryTime` (`tryTime`)
) ENGINE=TokuDB DEFAULT CHARSET=utf8
1 row in set (0.01 sec)ERROR:
No query specifiedzjy@127.0.0.1 : test 10:59:45>insert into login_log_Toku select * from login_log;
Query OK, 49534274 rows affected (18 min 35.63 sec)
Records: 49534274  Duplicates: 0  Warnings: 0zjy@127.0.0.1 : test 11:18:40>create table login_log_innodb like login_log;
Query OK, 0 rows affected (0.11 sec)zjy@127.0.0.1 : test 11:27:58>insert into login_log_innodb select * from login_log;
Query OK, 49534274 rows affected (2 hours 1 min 34.06 sec)
Records: 49534274  Duplicates: 0  Warnings: 0zjy@127.0.0.1 : test 01:29:38>create table login_log_myisam like login_log;
Query OK, 0 rows affected (0.15 sec)zjy@127.0.0.1 : test 08:56:30>alter table login_log_myisam engine = myisam;
Query OK, 0 rows affected (0.10 sec)
Records: 0  Duplicates: 0  Warnings: 0zjy@127.0.0.1 : test 08:56:51>insert into login_log_myisam select * from login_log;
Query OK, 49534274 rows affected (14 min 25.44 sec)
Records: 49534274  Duplicates: 0  Warnings: 0

上面看到写入TokuDB表的时间远远小于InnoDB,MyISAM(堆表)的写入也比InnoDB好很多。

-rw-rw---- 1 mysql mysql 8.7K  5月  7 23:27 login_log_innodb.frm
-rw-rw---- 1 mysql mysql 9.7G  5月  8 03:12 login_log_innodb.ibd
-rw-rw---- 1 mysql mysql 8.7K  5月  8 08:56 login_log_myisam.frm
-rw-rw---- 1 mysql mysql 3.8G  5月  8 09:00 login_log_myisam.MYD
-rw-rw---- 1 mysql mysql 1.7G  5月  8 09:11 login_log_myisam.MYI
-rw-rw---- 1 mysql mysql 8.7K  5月  8 16:43 login_log_Toku.frm

查看文件,看到InnoDB所占的空间比MyISAM大,9.7>5.5。TokuDB在数据库目录下面只保存.frm表结构定义文件,其数据保存在数据库的目录的上一层:

ls -lh *toku*
-rw------- 1 mysql mysql  12K  5月 12 17:00 log000000000005.tokulog27
-rw-rw---- 1 mysql mysql  64K  5月  8 16:43 _test_sql_c80_2a_status_34_1_1b.tokudb
-rw-rw---- 1 mysql mysql 265M  5月  8 16:43 _test_login_log_Toku_key_idx_tryip_3c_1_1b_B_1.tokudb
-rw-rw---- 1 mysql mysql 229M  5月  8 16:43 _test_login_log_Toku_key_idx_tryTime_3c_1_1b_B_3.tokudb
-rw-rw---- 1 mysql mysql 282M  5月  8 16:43 _test_login_log_Toku_key_idx_userid_3c_1_1b_B_2.tokudb
-rw-rw---- 1 mysql mysql 1.4G  5月  8 18:25 _test_login_log_Toku_main_3c_1_1b_B_0.tokudb
-rw-rw---- 1 mysql mysql  17K  5月  7 17:10 _test_ttt_main_5_1_1b_B_0.tokudb
-rw-rw---- 1 mysql mysql  16K  5月  7 17:10 _test_ttt_status_3_1_1b.tokudb
-rw-rw---- 1 mysql mysql  32K  5月  8 16:43 tokudb.directory
-rw-rw---- 1 mysql mysql  16K  5月  7 17:09 tokudb.environment
-rw------- 1 mysql mysql    0  5月  7 17:09 __tokudb_lock_dont_delete_me_data
-rw------- 1 mysql mysql    0  5月  7 17:09 __tokudb_lock_dont_delete_me_environment
-rw------- 1 mysql mysql    0  5月  7 17:09 __tokudb_lock_dont_delete_me_logs
-rw------- 1 mysql mysql    0  5月  7 17:09 __tokudb_lock_dont_delete_me_recovery
-rw------- 1 mysql mysql    0  5月  7 17:09 __tokudb_lock_dont_delete_me_temp
-rw-rw---- 1 mysql mysql  32K  5月  8 16:43 tokudb.rollback

从上面看出,TokuDB的索引文件和数据文件是分开的,一个索引一个文件。总共大小为2.2G,最小。其他为TokuDB的日志文件和一些元数据。

2)存储引擎转换和事务支持:

1:存储引擎转换

zjy@127.0.0.1 : test 06:08:48>show create table log\G;
*************************** 1. row ***************************Table: log
Create Table: CREATE TABLE `log` (`userID` varchar(255) NOT NULL,`tryIP` varchar(255) DEFAULT NULL,`tryTime` datetime DEFAULT NULL,`tryResult` tinyint(1) DEFAULT '0',`refferUrl` varchar(255) DEFAULT NULL,`sID` int(10) unsigned NOT NULL DEFAULT '0',`authType` tinyint(1) DEFAULT '1',`type` tinyint(1) DEFAULT '1',`deviceType` varchar(64) DEFAULT '',KEY `idx_userid` (`userID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.01 sec)ERROR:
No query specifiedzjy@127.0.0.1 : test 06:08:50>alter table log engine = tokudb;
Query OK, 100 rows affected (0.02 sec)
Records: 100  Duplicates: 0  Warnings: 0zjy@127.0.0.1 : test 06:08:56>select * from log;
有数据,数据未丢失。zjy@127.0.0.1 : test 06:09:34>show create table log\G;
*************************** 1. row ***************************Table: log
Create Table: CREATE TABLE `log` (`userID` varchar(255) NOT NULL,`tryIP` varchar(255) DEFAULT NULL,`tryTime` datetime DEFAULT NULL,`tryResult` tinyint(1) DEFAULT '0',`refferUrl` varchar(255) DEFAULT NULL,`sID` int(10) unsigned NOT NULL DEFAULT '0',`authType` tinyint(1) DEFAULT '1',`type` tinyint(1) DEFAULT '1',`deviceType` varchar(64) DEFAULT '',KEY `idx_userid` (`userID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8
1 row in set (0.12 sec)ERROR:
No query specifiedzjy@127.0.0.1 : test 06:09:37>alter table log engine = tokudb;
Query OK, 100 rows affected (0.02 sec)
Records: 100  Duplicates: 0  Warnings: 0zjy@127.0.0.1 : test 06:15:24>select * from log;
有数据,数据未丢失。反推把TokuDB转换成InnoDB和MyISAM也没有问题。

2:事务支持

zjy@127.0.0.1 : test 03:20:19>create table tmp_innodb(id int,name varchar(10))engine = innodb default charset utf8;
Query OK, 0 rows affected (0.44 sec)zjy@127.0.0.1 : test 03:20:57>create table tmp_myisam(id int,name varchar(10))engine = myisam default charset utf8;
Query OK, 0 rows affected (0.01 sec)zjy@127.0.0.1 : test 03:21:07>create table tmp_tokudb(id int,name varchar(10))engine = tokudb default charset utf8;
Query OK, 0 rows affected (0.05 sec)zjy@127.0.0.1 : test 03:21:17>start transaction;
Query OK, 0 rows affected (0.01 sec)zjy@127.0.0.1 : test 03:21:47>insert into tmp_innodb values(1,'a'),(2,'b'),(3,'c');
Query OK, 3 rows affected (0.11 sec)
Records: 3  Duplicates: 0  Warnings: 0zjy@127.0.0.1 : test 03:22:10>insert into tmp_myisam values(1,'a'),(2,'b'),(3,'c');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0zjy@127.0.0.1 : test 03:22:17>insert into tmp_tokudb values(1,'a'),(2,'b'),(3,'c');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0zjy@127.0.0.1 : test 03:22:22>commit;
Query OK, 0 rows affected (0.02 sec)zjy@127.0.0.1 : test 03:22:26>select * from tmp_innodb;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | c    |
+------+------+
3 rows in set (0.16 sec)zjy@127.0.0.1 : test 03:22:52>select * from tmp_myisam;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | c    |
+------+------+
3 rows in set (0.01 sec)zjy@127.0.0.1 : test 03:22:56>select * from tmp_tokudb;    #和innodb一样,数据提交写入
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | c    |
+------+------+
3 rows in set (0.01 sec)zjy@127.0.0.1 : test 03:23:04>start transaction;                                                                                       Query OK, 0 rows affected (0.16 sec)zjy@127.0.0.1 : test 03:23:17>insert into tmp_innodb values(11,'aa'),(22,'bb'),(33,'cc');
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0zjy@127.0.0.1 : test 03:23:39>insert into tmp_myisam values(11,'aa'),(22,'bb'),(33,'cc');
Query OK, 3 rows affected (0.12 sec)
Records: 3  Duplicates: 0  Warnings: 0zjy@127.0.0.1 : test 03:23:51>insert into tmp_tokudb values(11,'aa'),(22,'bb'),(33,'cc');
Query OK, 3 rows affected (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 0zjy@127.0.0.1 : test 03:24:30>rollback;
Query OK, 0 rows affected, 1 warning (0.01 sec)   #myisam不支持事务引发的warningzjy@127.0.0.1 : test 03:24:40>select * from tmp_innodb;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | c    |
+------+------+
3 rows in set (0.29 sec)zjy@127.0.0.1 : test 03:24:49>select * from tmp_myisam;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | c    |
|   11 | aa   |
|   22 | bb   |
|   33 | cc   |
+------+------+
6 rows in set (0.18 sec)zjy@127.0.0.1 : test 03:24:55>select * from tmp_tokudb;  #和innodb一样,数据被回滚。
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|    3 | c    |
+------+------+
3 rows in set (0.00 sec)

3)复制相关

MySQL的复制是通过Master利用binlog IO线程把修改数据库的SQL推送到Slave上,Slave通过本地的binlog IO线程把SQL写入到中继日志里(relay log)里,再通过SQL线程回放这些SQL,应用到数据库。复制的核心在于binlog,而binlog和存储引擎是没有关系,所以从理论上说主从的存储引擎不一样也不影响复制。

MASTER:主上建表写入
rep@192.168.200.25 : test 08:55:58>create table tmp_engine(id int,name varchar(10))default charset utf8;
Query OK, 0 rows affected (0.24 sec)rep@192.168.200.25 : test 08:56:57>insert into tmp_engine values(1,'a'),(2,'b');
Query OK, 2 rows affected (0.15 sec)
Records: 2  Duplicates: 0  Warnings: 0rep@192.168.200.25 : test 08:59:18>insert into tmp_engine values(11,'aa'),(22,'bb');
Query OK, 2 rows affected (0.37 sec)
Records: 2  Duplicates: 0  Warnings: 0rep@192.168.200.25 : test 08:59:25>select * from tmp_engine;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|   11 | aa   |
|   22 | bb   |
+------+------+
4 rows in set (0.24 sec)SLAVE:从上同步数据,并修改存储引擎
zjy@127.0.0.1 : test 09:00:01>select * from tmp_engine;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|   11 | aa   |
|   22 | bb   |
+------+------+
4 rows in set (0.19 sec)zjy@127.0.0.1 : test 09:00:04>alter table tmp_engine engine = tokudb;
Query OK, 4 rows affected (0.02 sec)
Records: 4  Duplicates: 0  Warnings: 0MASTER:主上继续写入
rep@192.168.200.25 : test 09:00:24>insert into tmp_engine values(1111,'aaaa'),(2222,'bbbb');
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0rep@192.168.200.25 : test 09:00:29>select * from tmp_engine;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|   11 | aa   |
|   22 | bb   |
|  111 | aaa  |
|  222 | bbb  |
| 1111 | aaaa |
| 2222 | bbbb |
+------+------+
8 rows in set (0.05 sec)SLAVE:从上修改完存储引擎之后,数据继续正常同步。
zjy@127.0.0.1 : test 09:00:13>select * from tmp_engine;
+------+------+
| id   | name |
+------+------+
|    1 | a    |
|    2 | b    |
|   11 | aa   |
|   22 | bb   |
|  111 | aaa  |
|  222 | bbb  |
| 1111 | aaaa |
| 2222 | bbbb |
+------+------+
8 rows in set (0.23 sec)

从上面看出,主从复制和存储引擎无关,从上修改成和主上不通的存储引擎,正常同步。

4)备份相关

TokuDB 有自己的热备份方案: tokudb-hot-backup-part-1 、 tokudb-hot-backup-part-2 ,和其他存储引擎一样也可以使用mysqldump进行备份。

-- MySQL dump 10.13  Distrib 5.6.19, for osx10.7 (x86_64)
--
-- Host: 192.168.200.240    Database: test
-- ------------------------------------------------------
-- Server version       5.6.23-72.1/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;--
-- Table structure for table `tmp_engine`
--

DROP TABLE IF EXISTS `tmp_engine`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `tmp_engine` (`id` int(11) DEFAULT NULL,`name` varchar(10) DEFAULT NULL
) ENGINE=TokuDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;--
-- Dumping data for table `tmp_engine`

View Code

从上面看出通过mysqldump进行备份和其他存储引擎备份效果一样。

5)其他

可以想InnoDB存储引擎一样,看事务、锁的信息:

SELECT * FROM information_schema.tokudb_trx;SELECT * FROM information_schema.tokudb_locks

参数说明

+---------------------------------+--------------+
| Variable_name                   | Value        |
+---------------------------------+--------------+
| tokudb_alter_print_error        | OFF          |
| tokudb_analyze_delete_fraction  | 1.000000     |
| tokudb_analyze_time             | 5            |
| tokudb_block_size               | 4194304      |
| tokudb_bulk_fetch               | ON           |
| tokudb_cache_size               | 67545966592  |
| tokudb_check_jemalloc           | 1            |
| tokudb_checkpoint_lock          | OFF          |
| tokudb_checkpoint_on_flush_logs | OFF          |
| tokudb_checkpointing_period     | 60           |
| tokudb_cleaner_iterations       | 5            |
| tokudb_cleaner_period           | 1            |
| tokudb_commit_sync              | ON           |
| tokudb_create_index_online      | ON           |
| tokudb_data_dir                 |              |
| tokudb_debug                    | 0            |
| tokudb_directio                 | OFF          |
| tokudb_disable_hot_alter        | OFF          |
| tokudb_disable_prefetching      | OFF          |
| tokudb_disable_slow_alter       | OFF          |
| tokudb_disable_slow_update      | OFF          |
| tokudb_disable_slow_upsert      | OFF          |
| tokudb_empty_scan               | rl           |
| tokudb_fs_reserve_percent       | 5            |
| tokudb_fsync_log_period         | 0            |
| tokudb_hide_default_row_format  | ON           |
| tokudb_killed_time              | 4000         |
| tokudb_last_lock_timeout        |              |
| tokudb_load_save_space          | ON           |
| tokudb_loader_memory_size       | 100000000    |
| tokudb_lock_timeout             | 4000         |
| tokudb_lock_timeout_debug       | 1            |
| tokudb_log_dir                  |              |
| tokudb_max_lock_memory          | 8443245824   |
| tokudb_optimize_index_fraction  | 1.000000     |
| tokudb_optimize_index_name      |              |
| tokudb_optimize_throttle        | 0            |
| tokudb_pk_insert_mode           | 1            |
| tokudb_prelock_empty            | ON           |
| tokudb_read_block_size          | 65536        |
| tokudb_read_buf_size            | 131072       |
| tokudb_read_status_frequency    | 10000        |
| tokudb_row_format               | tokudb_zlib  |
| tokudb_rpl_check_readonly       | ON           |
| tokudb_rpl_lookup_rows          | ON           |
| tokudb_rpl_lookup_rows_delay    | 0            |
| tokudb_rpl_unique_checks        | ON           |
| tokudb_rpl_unique_checks_delay  | 0            |
| tokudb_support_xa               | ON           |
| tokudb_tmp_dir                  |              |
| tokudb_version                  | tokudb-7.5.6 |
| tokudb_write_status_frequency   | 1000         |
+---------------------------------+--------------+

View Code

与性能相关的参数及说明:

Tokudb_cache_size(bytes):类似于innodb buffer pool

缓存大小,读写时候,数据会首先会缓存到这里。默认大小为机器物理内存的一半。

Tokudb_commit_sync(ON/OFF):类似于innodb_flush_log_at_commit

当事务提交的时候,是否要fsync log到磁盘。
默认开启(ON),如果设置为OFF,性能会提升,但可能会丢失事务(commit记录到log buffer,但是未fsync到磁盘的事务)。

Tokudb_directio(ON/OFF):

是否开启Direct I/O功能,TokuDB在写盘的时候,无论是否开启Direct I/O,都是按照512字节对齐的。默认为OFF。

Tokudb_fsync_log_period:

多久fsync一下log buffer到磁盘,TokuDB的log buffer总大小为32MB且不可更改。默认为0ms(此时做fsync的后台线程一直处于wait状态),此时受tokudb_commit_sync开关控制是否要fsync log到磁盘(checkpoint也会fsync log buffer的,默认为1分钟)。

Tokudb_checkpointing_period:

checkpoint的时间间隔,默认60s,innodb有2种checkpoint机制,一个是在数据库关闭时,刷写脏页到磁盘;另一个在数据库运行时刷出一部分脏页。而TokuDB采取第一种,60s刷写脏页。Innodb的重做日志是一组日志文件循环写入,当日志文件写满时会从头开始写,当头的数据页还没有刷写到磁盘会卡住进行强制刷写,此时的写入操作都要等待。TokuDB没有重做日志的概念,当写满日志文件时,会生成下一个文件,继续写。当数据被刷写到磁盘后会被purge。

TokuDB_format:

 tokudb_row_format 可以设置如下的几个值:
  tokudb_default: 设置默认的压缩行为。在 TokuDB 7.1.0版本,默认使用zlib 库进行压缩,未来版本可能会改变。
  tokudb_fast: 使用quicklz 库的压缩模式。
  tokudb_small: 使用 lzma 库的压缩模式。
  tokudb_zlib: 使用 zlib 库的压缩模式,提供了中等级别的压缩比和中等级别的CPU消耗。
  tokudb_quicklz: 使用 quicklz 库的压缩模式, 提供了轻量级的压缩比和较低基本的CPU消耗。
  tokudb_lzma: 使用lzma库压缩模式,提供了高压缩比和高CPU消耗。
  tokudb_uncompressed: 不使用压缩模式。
可以使用如下命令修改行格式:
  ALTER TABLE table_name ROW_FORMAT=row_format;
  注意修改行格式的操作也是online 操作。

针对不同的使用场景:

1) 对数据要求较高(不允许丢失数据,事务ACID完整性),只需根据内存调整tokudb_cache_size大小即可,建议开启tokudb_directio。
2) 对数据要求不太高(允许部分数据丢失,不要求事务ACID完整性),可配置:
tokudb_commit_sync=OFF
tokudb_fsync_log_period=1000 #1s
在此配置下,每1秒对log buffer做下fsync,可充分利用log的group commit功能,如果TokuDB挂掉,则可能会丢失最多1秒的数据。

性能测试:InnoDB vs TokuDB

http://blog.csdn.net/lidan3959/article/details/37511645

http://www.cnblogs.com/billyxp/p/3567421.html#2888035

总结:

TokuDB优点

1,online ddl 非常给力,特别是对字段的修改非常快

2,压缩比非常高通常都能达到7,8倍的压缩比

3,完全支持ACID事物的四大特性

TokuDB缺点

1,响应时间相对较长

2,online ddl 对text,blob等类型的字段不适用

3,没有合适的备份工具,只能通过mysqldump进行逻辑备份

建议适用场景:

1,访问频率不高的数据或历史数据归档

2,表非常大并且时不时还需要进行ddl操作

TokuDB 引擎安装相关推荐

  1. tokudb mysql_【MySQL】TokuDB引擎安装教程

    TokuDB引擎安装起来貌似有点麻烦,在这里做个笔记,安装几步走 Percona MySQL5.6安装 TokuDB引擎安装 第一步咱们直接省略,跟官方版本MySQL5.6安装方法基本相同,下面来写下 ...

  2. MySQL TokuDB引擎安装详解

    背景: TokuDB引擎是有Tokutek开发的一个数据库存储引擎,在设计之初便引入了独特的索引算法,在其官网测试的文章中看到TokuDB性能比InnoDB高出很多. MySQL是一个插件式的数据库, ...

  3. TokuDB引擎安装详解

    背景 项目目前使用的Sequoiadb数据库,撑不住每小时千万的数据量了,所以领导安排研究TokuDB. 安装TokuDB引擎之前需要先安装MySQL,而且推荐的是Percona MySQL.本文选择 ...

  4. Percona Server for MySQL 安装TokuDB引擎

    Percona Server for MySQL 安装TokuDB引擎 TokuDB主要优点:insert数据比Innodb快的多,数据压缩比要Innodb高 官方文档https://docs.per ...

  5. 【Mysql】安装tokudb引擎

    平台支持: TokuDB 只能在 64-bit Linux 下使用. 最小内存要求:     TokuDB 需要至少1GB 的物理内存,当然这里建议最好是 2GB 安装tokuDB tokuDB内存分 ...

  6. mysql 社区版 tokudb_【Mysql】安装tokudb引擎

    平台支持: TokuDB 只能在 64-bit Linux 下使用. 最小内存要求: TokuDB 需要至少1GB 的物理内存,当然这里建议最好是 2GB 安装tokuDB tokuDB内存分配需要j ...

  7. tokudb引擎使用

    环境:centos 7.3 + mysql 5.7.19 tokudb是一种高压缩率的引擎,压缩率最高可以达到90%,可以用于日志存储类db. 具体使用过程如下: 1,关闭大页面转换功能: TokuD ...

  8. 在MYSQL上添加TokuDB引擎

    TokuDB引擎说明:TokuDB 的主要特点是高压缩比,高 INSERT 性能,支持大多数在线修改索引.添加字段,非常适合日志型应用场景(只有insert,select,少update): 一.安装 ...

  9. mysql tokudb引擎_在MYSQL上添加TokuDB引擎

    TokuDB引擎说明:TokuDB 的主要特点是高压缩比,高 INSERT 性能,支持大多数在线修改索引.添加字段,非常适合日志型应用场景(只有insert,select,少update): 一.安装 ...

最新文章

  1. npm publish 发布一个 Angular 库的时候报错
  2. kafka python教程_kafka python 指定分区消费
  3. poj1958 Strange Towers of Hanoi 题解报告
  4. 【VS2010学习笔记】【编程实例】 (含有类的动态链接库的封装和调用)
  5. webpack-dev-server‘ is not recognized as an internal or external command
  6. 微信或者QQ如何制作请用右上角打开浏览器
  7. php手机下载功能,phpwind手机客户端1.2版主要功能亮点详解
  8. 【软技能】完全写作指南--演讲
  9. 眼疲劳症如何自我检测
  10. 哪类人适合学软件测试?零基础能学测试吗?
  11. 使用Docker安装Redis并设置自启动
  12. 深度清理mac磁盘空间的方法,方方面面都清理干净
  13. SQL : 练习题-29题
  14. tesseract -图像识别
  15. 1688API详情接口调用展示
  16. c语言蚂蚁王国的货币系统,蚂蚁王国的探索之旅
  17. 即使不考CCSP认证,也要了解的知识有哪些?
  18. 在 C++ 中与 QML 对象交互
  19. Qt事件体系概述(The Event System)
  20. 运放专题:运放输出电压

热门文章

  1. 3D渲染技术分享:实时3D水面渲染(反射、折射、水深与水岸柔边)
  2. 蓝桥杯 算法训练 黑色星期五Python实现 吉姆拉尔森公式
  3. 导入项目报错,Syntax error on token Invalid Regular Expression Options, no accurate correc
  4. android请求读写外设权限,android读写文件完整版
  5. java 小明可以买什么
  6. Modem2G/3G/4G/5G:高通Policy Manager(概述,优势,架构与API,配置与debug方法)
  7. 数据库安全审计系统可以实现哪些价值?
  8. 中国31个主要城市绿地数据(空间分辨率为1m)
  9. 数据结构的那些“事”
  10. 爱拼t6输入法 v3.10 完整版 免费下载