2010-09-20 58 views
3

有誰知道什麼會更有效,並使用更少的資源:MySQL的性能:嵌套的插入/重複鍵VS多次更新

方法1 - 使用一個SELECT語句從一個表中獲取數據,然後遍歷它來在另一個表上執行多個UPDATE。例如。 (僞代碼,執行()運行查詢):

Query1_resultset = execute("SELECT item_id, sum(views) as view_count FROM tableA WHERE condition=1"); 
while(Query1_resultset as row) { 
    execute("UPDATE tableB SET view_count=row.view_count WHERE id=row.item_id"); 
} 


方法2 - 使用一個單一的INSERT ... ON DUPLICATE KEY UPDATE語句嵌套SELECT語句。 E.G .:

INSERT INTO tableB (id, view_count) SELECT item_id, SUM(views) as view_count FROM tableA WHERE condition=1 ON DUPLICATE KEY UPDATE view_count=VALUES(view_count); 

注意:tableB上的ID是主鍵。實際上不會有任何插入因爲我知道鑰匙將存在。所以這都是UPDATE。只需使用此語句即可傳遞單個查詢而不是多個查詢。

我真的很好奇,爲什麼要更高效。查詢的數量決定了其運行速度有多快?瓶頸在哪裏? 我正在尋找可縮放的東西(正在更新的行數每天都在增長)。

任何想法?

感謝

回答

0

我覺得INSERT.. ON DUPLICATE KEY UPDATE更有效(否則就沒有太大的意義添加這樣的擴展名)。順便說一句,你的第一個例子與第二個例子不完全一樣 - 你既不使用事務也不鎖定表,所以在執行UPDATE時,由SELECT返回的記錄可能不存在。

2

它取決於您的更新/插入比率。如果您有大量插入,並且只有一些更新比INSERT ... ON DUPLICATE KEY UPDATE聲明更快。

如果你主要有更新,比用UPDATE語句和插入作爲後備(如果沒有更新)更好。您可以使用多表更新子句來執行單個更新,而不是選擇後跟隨更新。如果您同時使用SELECTUPDATE,則INSERT肯定會更快。