2017-08-29 67 views
0

我有一個ruby腳本,它將XML文件導入到MySQL數據庫。它是通過XML文件中的元素循環,最後Ruby on rails:ActiveRecords的first_or_create非常慢

table.where(
      value: e['value'], 
      ... 
    ).first_or_create 

腳本必須處理大量的數據,大部分是已經在數據庫中。正因爲如此,它運行得非常慢,因爲first_or_create顯然會觸發很多SELECT查詢。

有什麼辦法可以更快處理?它與連接管理有關嗎?

感謝

+0

的XML文件(S),包含相同的元素多次記錄? – Stefan

+0

是否有通過上面的where命令生成的子句的索引? – whites11

回答

0

first_or_create當然是一個方便的方法,確實關於一個更大的數據集的表現並不太在乎。

確保您的所有索引都已到位。

提高性能的第一個顯而易見的方法是:因爲每個創建語句都被封裝在一個事務處理塊begincommit中。這是3個查詢一個插入。 您可以將整個循環放入transaction區塊 - 這會讓您獲得一些時間,因爲它只會執行begincommit一次。

請記住,往返數據庫的往返需要相當長的時間,因此顯而易見的性能提升是將多個語句合併爲一個。嘗試創建一個SELECT查詢查找一批,比方說1000條記錄。數據庫將返回200不存在,您可以繼續爲這200個查詢構建一個INSERT語句。

始終執行測量,並始終嘗試制定您嘗試達到的性能級別,以避免代碼過於冗長。

0

這是更好地消除需要的,如果不是create.check記錄在數據庫中,然後創建