Mysql

AWS RDS MySQL 隨著時間的推移變慢

  • August 24, 2020

我已經閱讀了很多關於這個主題的文章,但沒有一篇是關於 AWS RDS MySQL 數據庫的。從三天前開始,我在 AWS EC2 實例中執行一個 python 腳本,該腳本在我的 AWS RDS MySQL 數據庫中寫入行。我必須寫 3500 萬行,所以我知道這需要一些時間。我定期檢查數據庫的性能,三天后(今天)我意識到數據庫正在變慢。開始時,前 100,000 行僅在 7 分鐘內寫入(這是我正在使用的行的範例)

0000002178-14-000056    AccountsPayableCurrent  us-gaap/2014        20131231    0   USD 266099000.0000

三天后,數據庫已經寫入了 5,385,662 行,但現在寫 100,000 行需要將近 3 個小時。怎麼了?

我正在執行的 EC2 實例是 t2.small。如果需要,您可以在此處查看規格:EC2 SPECS 。我正在執行的 RDS 數據庫是 db.t2.small。在此處查看規格:RDS SPECS

我將在此處附上一些關於數據庫和 EC2 實例性能的圖表: Db CPU / Db Memory / Db Write IOPS / Db Write Throughput / EC2 Network in (bytes) / EC2 Network out (bytes)

如果你能幫助我,那就太好了。非常感謝。

編輯 1:我如何插入行? 正如我之前所說,我有一個在 EC2 實例上執行的 python 腳本,該腳本讀取文本文件,使用這些值進行一些計算,然後將每個“新”行寫入數據庫。這是我的一小段程式碼。 我如何閱讀文本文件?

for i in path_list:
 notify("Uploading: " + i)
 num_path = "path/" + i + "/file.txt"
 sub_path = "path/" + i + "/file.txt"

 try:
   sub_dict = {}
   with open(sub_path) as sub_file:
     for line in sub_file:
       line = line.strip().split("\t")
       sub_dict[line[0]] = line[1] # Save cik for every accession number
       sub_dict[line[1] + "-report"] = line[25] # Save report type for every CIK
       sub_dict[line[1] + "-frecuency"] = line[28] # Save frecuency for every CIK

   with open(num_path) as num_file:
     for line in num_file:
       num_row = line.strip().split("\t")

       # Reminder: sometimes in the very old reports, cik and accession number does not match. For this reason I have to write 
       # the following statement. To save the real cik.

       try: 
         cik = sub_dict[num_row[0]]
       except:
         cik = num_row[0][0:10]

       try: # If there is no value, pass
         value = num_row[7]
         values_dict = {
                 'cik': cik, 
                 'accession': num_row[0][10::].replace("-", ""),  
                 'tag': num_row[1], 
                 'value': value, 
                 'valueid': num_row[6], 
                 'date': num_row[4]
                 }

         sql = ("INSERT INTO table name (id, tag, value_num, value_id, endtime, cik, report, period) "
             "VALUES ('{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}', '{}')".format(
                 values_dict['cik'] + values_dict['accession'] + values_dict['date'] + values_dict['value'].split(".")[0] + "-" + values_dict['tag'], 
                 values_dict['tag'], 
                 float(values_dict['value']), 
                 values_dict['valueid'], 
                 values_dict['date'], 
                 int(values_dict['cik']), 
                 sub_dict[values_dict['cik'] + "-report"], 
                 sub_dict[values_dict['cik'] + "-frecuency"]
                 ))

         cursor.execute(sql)
         connection.commit()

我知道沒有什麼except:可以try表達的,但這只是腳本的一部分。我認為重要的部分是我如何插入每一行。如果我不需要使用這些值進行計算,我將使用Load Data Infile將文本文件寫入數據庫。我只是意識到commit每次插入一行時可能不是一個好主意。我將嘗試在 10,000 行左右之後送出。

T2 和 T3 實例(包括 db.t2 db.t3 實例)使用CPU Credit系統。當實例空閒時,它會累積 CPU 積分,然後它可以使用這些積分在短時間內更快地執行 -突增性能。一旦你耗盡積分,它就會減慢到基線性能

一種選擇是在您的 RDS 配置中啟用T2/T3 Unlimited設置,這將使實例在需要時全速執行,但您需要為所需的額外積分付費。

另一種選擇是將實例類型更改為 db.m5 或其他支持一致性能的非 T2/T3 類型。

以下是對 CPU 積分及其累積和使用方式的更深入解釋:關於澄清 t2 和 t3 工作條件?

希望有幫助:)

引用自:https://serverfault.com/questions/1031167