繁体   English   中英

MySQL InnoDB 插入性能(Windows)

[英]MySQL InnoDB insert performance (Windows)

我是 MySQL 的新手,我对InnoDB 性能有些怀疑。 我有一个表,我想在其中存储一些度量值,并且我正在使用存储过程中的循环测试密集插入:

CREATE TABLE `measures` (
  `Id` int(10) unsigned NOT NULL,
  `DT` datetime NOT NULL,
  `TF1` float DEFAULT '0',
  `IF1` float DEFAULT '0',
  `PAF1` float DEFAULT '0',
  `PRF1` float DEFAULT '0',
  `CF1` float DEFAULT '0',
  `TF2` float DEFAULT '0',
  `IF2` float DEFAULT '0',
  `PAF2` float DEFAULT '0',
  `PRF2` float DEFAULT '0',
  `CF2` float DEFAULT '0',
  `TF3` float DEFAULT '0',
  `IF3` float DEFAULT '0',
  `PAF3` float DEFAULT '0',
  `PRF3` float DEFAULT '0',
  `CF3` float DEFAULT '0',
  `CTotal` float DEFAULT '0',
  PRIMARY KEY (`Id`,`DT`),
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE PROCEDURE `sp_INSERT_TEST`()
BEGIN
        DECLARE i INT DEFAULT 1;

        WHILE (i<=6000) DO

            INSERT INTO measures
            (Id, DT, TF1, IF1, PAF1, PRF1, CF1, TF2, IF2, PAF2, PRF2, CF2, 
TF3, IF3, PAF3, PRF3, CF3, CTotal) 
            VALUES 
            (1, TIMESTAMPADD(MINUTE,i, NOW()), 
            0.1, 1, 10, 100, 1000,
            0.2, 2, 20, 200, 2000,
            0.3, 3, 30, 300, 3000,
            i * 10);

            SET i=i+1;
        END WHILE;
END

执行时间约为150 秒,但如果我使用MyISAM而不是InnoDB ,则时间约为0.2 秒

两个引擎之间的这种性能差异是否正常? 是否可以使用 InnoDB 改进插入以接近 MyISAM 性能或者它是引擎限制?

注意:我使用的是MySQL 5.1.56 (64 bit)Windows 7 x64 ,开发人员机器的默认配置(我也尝试过服务器配置,但性能相似)。

提前致谢。 约翰

就像 peufeu 所说的,你可以通过只使用一个事务来提高性能。 如果您愿意放松 ACID,您可以通过设置获得更好的性能

innodb_flush_log_at_trx_commit=0

在我的.ini 中。

InnoDB 通常比 MyISAM 慢,它是具有ACID属性的事务数据库引擎。 但是,更改配置或做事方式会对速度产生很大影响。

首先是行不通的事情:添加缓存是无用的,减少表上的索引数量会有所帮助,因为您必须在插入时创建更少的索引,但在您的情况下,您只有主键。

我的建议是尝试以下方法之一:

  • 在单个事务中运行所有 INSERT 查询,然后在最后提交。

    示例:SET 自动提交=0; 插入语句; 犯罪;

  • 使用扩展的插入语法,允许一起插入多行。 我以为 InnoDB 不支持,但我只是尝试使用 MySQL 5.0.75 并且它有效。 我不认为你可以一次插入所有 6000 行,因为你受到 max_allowed_packet 的限制(如果你愿意,你可以增加它)。 例如,您可以一次插入 500 行。

    示例:INSERT INTO table (field1, field2) VALUES (1, test'), (2, 'hello');

是的,这很正常。 像所有事务数据库一样,InnoDB 必须确保 ACID 一致性,这需要大量工作,而且会影响您的性能的是,在每个事务结束时,它必须等待硬盘说“OK,数据已写入”,至于 ACID 中的“D=Durability”。

解决方案只是在单个事务中发出您的批量 INSERT,即 BEGIN、批量 INSERT、COMMIT。

或者使用更合适的东西,比如 LOAD DATA INFILE,或者至少使用多行 INSERT。

其他海报是正确的 - 在一次交易中完成所有工作。

6000 行是一个如此小的表,插入性能与如此小的数据集并不真正相关。

无论如何,现代数据库都没有针对这种“玩具”系统进行优化。

尝试十亿条记录,并通过合理的交易规模来完成,然后看看谁赢了。

拔掉插头,看看谁恢复得更快(提示:不会是myisam)

使用 LOAD DATA INFILE 或批量插入可能会提高存储过程的性能,即使它在一个事务中,因为 mysql SP 语言并不总是特别有效。

除了 stivlo 所说的一切 - 您可能会发现以下文章和随附的视频很有用。

http://www.mysqlperformanceblog.com/2011/03/18/video-the-innodb-storage-engine-for-mysql/

正如 Morgan Tocker 在他的演讲中所说的“朋友不要让朋友使用 myisam”

希望你觉得它很有启发性:)

MyISAM 在插入方面比 InnoDB 快,但不到 750 倍,这表明您需要对 InnoDB 进行调整。 这是一个之前已经介绍过的主题,例如您可以在以下博客中阅读一些好东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM