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 秒。
我是否错过了其他一些设置?
提前致谢!
这听起来不像是一个非常有趣的测试(100,000 行并不是很多,并且您的插入不是并发的),但这是您正在寻找的设置。
发出“set tokudb_commit_sync=0;” 将关闭提交操作上的 fsync()。请注意,此模式下没有持久性保证。
正如我之前提到的,TokuDB 的优势在于索引明显大于 RAM 的数据,而本次测试并非如此。