2013-05-12 100 views
0

我有15 Amazon AWS EC2 t1.microinctances同时填充Amazon RDS MySQL d2.m2.xlarge数据库与数据使用大型INSERTs(查询40000行)。来自多个主机的批量插入preformace优化

查询不断发送。该表是INNODB,两个INT列,两列都有索引。数据接收期间RDS实例的CPU利用率约为30%。

当我有一个EC2实例时,速度更快,然后我同时运行15个实例。 15个实例组的工作速度越来越慢,直到速度变得完全不令人满意。

如何优化此过程的性能?

UPD: 我SHOW CREATE TABLE结果如下:

CREATE TABLE `UserData` (
`uid` int(11) NOT NULL, 
`data` int(11) NOT NULL, 
PRIMARY KEY (`uid`,`data`), 
KEY `uid` (`uid`), 
KEY `data` (`data`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

我需要2个指标导致它是nessecary对我来说,通过uiddata值获取数据。

我用INSERT INTO UserData (uid, data) VALUES (1,2),(1,3),(1,10),...和40000 (uid,data)对插入数据。

15个并行实例在2小时内插入〜121 000 000行,但我相信它可以更快。

+0

您可能正在运行锁和IO等待。插入行后是否有可能创建索引? – datasage 2013-05-13 02:34:09

+0

我插入了非常大量的数据,数百Gb。事后创建索引需要多长时间? – zavg 2013-05-13 12:23:56

+0

如果你正在做你现在正在做的事情,索引会在每次插入后更新。随着您的表格变大,这些索引更新需要更多时间才能完成,因为可能需要重新制定数据。如果你可以放弃你的索引并在最后添加它们,那么它将一次创建索引。索引仍然可能需要大量时间才能完成,但是如果您在每次插入之后进行更新,索引的数量可能会减少。 – datasage 2013-05-13 13:35:06

回答

0

我可以在这些领域的感知问题:

点1)t1.micro被爆实例,它通常用于spikey计算负载好。既然你已经提到过,你将继续使用它来进行数据库查询/事务处理,它可能会降低整体性能。请将实例类型更改为更好的可预测的类型。

点2)m2.xlarge和t1.micro带有有限的NW带宽容量。如果您使用数据库进行交易/查询的数据量(以MB /秒为单位)高于NW带宽容量,那么您也可以观察到吞吐量降低。想象一下,如果15个t1.micro试图推动100MB /秒,它可能比t1.micros和数据库实例类型之间存在的NW管道多

+0

所以这个想法是将我的MySQL服务器分成几个,从而平衡流量? – zavg 2013-05-13 14:43:28

+0

关于第1点:当只有一个t1.micro运行时,它将数据非常快地推入数据库。 – zavg 2013-05-13 15:12:42