2016-01-13 33 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