【发布时间】:2014-02-18 19:45:14
【问题描述】:
我准备了以下 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));
TokuDB:
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 的 cmets,我已将我的设置修改为“tokudb_commit_sync=OFF”,现在 TokuDB 在小数据集上的插入率似乎很有意义(一旦我发现以下问题,我将在大数据集上执行它们):
但是,与 MyISAM 和 InnoDB 相比,TokuDB 的选择性能仍然是有线的(其中 ? 被我的模拟器替换为不同的 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 秒。
我是否错过了一些其他设置?
提前致谢!
【问题讨论】:
-
离题。不是编程问题。这是更多的数据库配置/调整。请尝试使用 DBA 站点。
-
设置 unique_checks=off; ??
标签: mysql innodb myisam mariadb tokudb