我准备了以下 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));
InnoDB:
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));
托库数据库:
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));
一开始,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=?;
对于一百万个数据集,MyISAM 和 InnoDB 分别花费 10k 和 15 秒的每 10k SELECT 语句,但 TokuDB 需要大约 40 秒。
我错过了其他一些设置吗?
提前致谢!