简单的InnoDB表上的简单MySQL INSERT查询需要40 + ms

时间:2012-07-16 18:07:15

标签: mysql performance insert innodb myisam

我想知道是什么原因导致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表运行时间更长?或?

2 个答案:

答案 0 :(得分:2)

每个自动提交的INSERT有三个方面需要考虑

ASPECT#1。开销

InnoDB支持MVCC和事务隔离作为符合ACID标准的存储引擎。为了适应这种情况,在提交更改之前的行的副本将写入系统表空间文件ibdata1的“撤消表空间”部分。如果你正在运行INSERT会写什么? 空白行的副本。这样,回滚只会删除INSERT尝试。当INSERT in committed时,撤消表空间中的空白副本将被清除。

ASPECT#2。聚集索引

对于每个InnoDB表,都存在an internal default row index called gen_clust_index。无论是否存在PRIMARY KEY,都会创建此项。由于您的表具有id的PRIMARY KEY,因此gen_clust_index被构造为与包含唯一id字段的行相关联。

ASPECT#3。构造

信不信由你,有时MySQL 4.1开箱即用的速度比MySQL 5.5快。听起来令人震惊,不是吗? Percona实际上对几个版本的MySQL进行了基准测试,结果就是这样。

我之前在DBA StackExchange中写过这篇文章

答案 1 :(得分:1)

CPU不是这里的因素。因素是磁盘。 在innodb中,命令需要写入日志,所以如果日志磁盘是相同的磁盘或磁盘不是碎片或磁盘慢,那么你将有很大的不同。