为什么 TokuDB 和 InnoDB 插入比 MyISAM 慢

Ye *_*ang 2 mysql myisam innodb mariadb tokudb

我准备了以下SQL语句来比较MyISAM、InnoDB和TokuDB的性能行为(INSERT执行100000次):

MyISAM:

CREATE TABLE `testtable_myisam` (`id` bigint(20) NOT NULL AUTO_INCREMENT, `value1` INT DEFAULT NULL, `value2` INT DEFAULT NULL, PRIMARY KEY (`id`), KEY `index1` (`value1`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `testtable_myisam` (`value1`, `value2`) VALUES (FLOOR(RAND() * 1000), FLOOR(RAND() * 1000)); 
Run Code Online (Sandbox Code Playgroud)

索引数据库:

CREATE TABLE `testtable_innodb` (`id` bigint(20) NOT NULL AUTO_INCREMENT, `value1` INT DEFAULT NULL, `value2` INT DEFAULT NULL, PRIMARY KEY (`id`), KEY `index1` (`value1`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `testtable_innodb` (`value1`, `value2`) VALUES (FLOOR(RAND() * 1000), FLOOR(RAND() * 1000));
Run Code Online (Sandbox Code Playgroud)

德库数据库:

CREATE TABLE `testtable_tokudb` (`id` bigint(20) NOT NULL AUTO_INCREMENT, `value1` INT DEFAULT NULL, `value2` INT DEFAULT NULL, PRIMARY KEY (`id`), KEY `index1` (`value1`)) ENGINE=TokuDB DEFAULT CHARSET=utf8;

INSERT INTO `testtable_tokudb` (`value1`, `value2`) VALUES (FLOOR(RAND() * 1000), FLOOR(RAND() * 1000));
Run Code Online (Sandbox Code Playgroud)

一开始InnoDB的INSERT性能比MyISAM慢了近50倍,TokuDB比MyISAM慢了40倍。

然后我找出了InnoDB上“innodb-flush-log-at-trx-commit=2”的设置,使其INSERT行为与MyISAM类似。

问题是,我应该在 TokuDB 上做什么?我敢打赌 TokuDB 糟糕的 INSERT 性能也是由一些不正确的设置引起的,但我无法弄清楚原因。

- - - - - 更新 - - - - -

感谢 tmcallaghan 的评论,我已将设置修改为“tokudb_commit_sync=OFF”,现在 TokuDB 在小数据集上的插入率似乎有意义(一旦我弄清楚以下问题,我将在大数据集上执行它们):

然而,与 MyISAM 和 InnoDB 相比,TokuDB 的选择性能仍然是有线的,使用以下 SQL(其中 ? 被我的模拟器替换为不同的 Int):

SELECT id, value1, value2 FROM testtable_myisam WHERE value1=?; 
SELECT id, value1, value2 FROM testtable_innodb WHERE value1=?; 
SELECT id, value1, value2 FROM testtable_tokudb WHERE value1=?; 
Run Code Online (Sandbox Code Playgroud)

对于一百万个数据集,MyISAM 和 InnoDB 每 10k 条 SELECT 语句分别花费 10 秒和 15 秒,但 TokuDB 需要大约 40 秒。

我是否错过了其他一些设置?

提前致谢!

tmc*_*han 5

这听起来不像是一个非常有趣的测试(100,000 行并不是很多,并且您的插入不是并发的),但这是您正在寻找的设置。

发出“set tokudb_commit_sync=0;” 将关闭提交操作上的 fsync()。请注意,此模式下没有持久性保证。

正如我之前提到的,TokuDB 的优势在于索引明显大于 RAM 的数据,而本次测试并非如此。