我想知道是什么原因导致mysql / innodb上的插入查询在具有相当强大的CPU的机器上持续至少40ms。 “等效”查询在相同的MyISAM表上运行<10ms(表没有任何外键)。时间来自MySQL控制台。
这是“尽可能简单”的数据库结构,用于复制。
CREATE TABLE `test_table_innodb` (
`id` int NOT NULL AUTO_INCREMENT,
`int_column` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `test_table_myisam` (
`id` int NOT NULL AUTO_INCREMENT,
`int_column` int NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
我正在从mysql控制台运行相同的查询(在InnoDB的情况下自动提交事务)。当时没有其他查询在机器上执行,结果是:
mysql> insert into test_table_myisam (int_column) values (5);
Query OK, 1 row affected (0.00 sec)
mysql> insert into test_table_innodb (int_column) values (5);
Query OK, 1 row affected (0.06 sec)
交易开销是否使查询对InnoDB表运行时间更长?或?
答案 0 :(得分:2)
每个自动提交的INSERT有三个方面需要考虑
InnoDB支持MVCC和事务隔离作为符合ACID标准的存储引擎。为了适应这种情况,在提交更改之前的行的副本将写入系统表空间文件ibdata1
的“撤消表空间”部分。如果你正在运行INSERT会写什么? 空白行的副本。这样,回滚只会删除INSERT尝试。当INSERT in committed时,撤消表空间中的空白副本将被清除。
对于每个InnoDB表,都存在an internal default row index called gen_clust_index
。无论是否存在PRIMARY KEY,都会创建此项。由于您的表具有id的PRIMARY KEY,因此gen_clust_index被构造为与包含唯一id字段的行相关联。
信不信由你,有时MySQL 4.1开箱即用的速度比MySQL 5.5快。听起来令人震惊,不是吗? Percona实际上对几个版本的MySQL进行了基准测试,结果就是这样。
我之前在DBA StackExchange中写过这篇文章
答案 1 :(得分:1)
CPU不是这里的因素。因素是磁盘。 在innodb中,命令需要写入日志,所以如果日志磁盘是相同的磁盘或磁盘不是碎片或磁盘慢,那么你将有很大的不同。