2016-01-13 30 views
4

我有db.r3.2xlarge 4000 PIOPS。我从EC2实例插入10亿行。现在有40GB的可用RAM。为什么AWS RDS MYSQL INSERT需要读取IOPS?

目前,在4000个PIOPS中,READ PIOPS需要3000个,而我只能获得1000个WRITE PIOPS。所以,这是一个低写作。

我该如何检查正在读取PIOPS?以及如何加快速度?

谢谢。

编辑:

insert ignore into dna (hash, time, song_id) values (b%s, b%s, %s)

I'm using self.cursor.executemany(query, rows)从蟒

hash + time + song_id是复合主键。

我正在使用AWS RDS InnoDB。

我有4000 PIOPS。但是,它现在一直停留在2000年。我有60MB/s的WRITE THROUGHPUT。

+1

向我们展示insert语句,告诉我们您正在使用哪种类型的数据库,并确认您实际使用的是RDS,而不是安装在EC2 – Vorsprung

+0

@Vorsprung上的数据库,我已经进行了编辑。请告诉我。 – moeseth

+0

可能不会有什么区别,但是您还没有说过如果您使用的是mysql或Aurora – Vorsprung

回答

2

如果散列是您的主键或已建立索引,则不会以主要的我和/或索引顺序插入。

此外,您正在使用INSERT IGNORE,这表明您正试图避免不可避免的重复键错误,因为您插入的内容中存在重复的数据。

由于这两个原因,InnoDB必须做大量的准备工作才能将适当的页面从磁盘上的表空间加载到内存中,以找到主要和/或次要索引中的下一行需要去,如果该行是重复的,这可能会变成浪费精力,并且可能会需要页面拆分,以便空间可用于随机将下一个散列插入到适当的位置。

如果散列是主键,那么在插入时删除所有其他索引可能会有好处,然后将它们添加到最后,从而可以更有效地构建它们。

如果批次足够大并且散列确实是主键,则通过散列对插入进行预先排序应该会有所帮助。

+0

我的节目创建表看起来像 - CREATE TABLE'dna'( 'hash'位(26)NOT NULL, 'time'位(14)NOT NULL, 'song_id' MEDIUMINT(9)NOT NULL, PRIMARY KEY ('hash','time','song_id')使用BTREE )ENGINE = InnoDB DEFAULT CHARSET = latin1 – moeseth

+0

'bit(26)'是一个有趣的选择。我假设你意识到(如果我的数学是正确的),这一列只能支持67,108,864(2^26)个独特的哈希值。你是按排序顺序(hash,time,song_id)插入行吗? –

+0

嗨,我不知道你排序的顺序是什么意思。我的主键是(hash + time + song_id),所以它不仅仅是位(26)。在决定它是否唯一时,它也会考虑time + song_id。不是吗? – moeseth