Sql-Server

SQL Server Merge vs MySQL Insert On Duplicate Key 性能比較

  • March 1, 2017

我一直在尋找這種比較或某種性能平衡。

到目前為止我所知道的是:

  1. MERGE是已經在 SQL Server 上實現的T-SQL命令。據我所知,它的性能非常好,因為它使用“有點像INNER JOIN雜湊映射來插入和更新,但是在使用CLUSTERED INDEX時,我在同一個****MERGE語句上刪除時也遇到了一些問題. 除此之外,它非常快,讓我在更新或插入某些東西之前做一些比較子句,所以對我來說非常靈活。
  2. 在 SQL Server 中,某些特定場景寧願將UPDATEINSERT用作單獨的語句,我不反對。在我短暫的經驗中,我會預設使用MERGE作為我的程式碼的標準。
  3. 現在作為一名 DBA,我面臨著一個新的挑戰,我還必須管理 MySQL 伺服器,所以我最終在 MySQL 中尋找類似的MERGE行為來提高查詢的性能。到目前為止,除了INSERT … ON DUPLICATE KEY … UPDATE之外,我沒有發現任何相似之處。儘管如此,我還是有一些性能問題,因為我不確定它在伺服器上的表現如何,它是如何工作的,以及可選的語句是否會比這更好或更快地工作。
  4. 在 MySQL 中環顧四周,我發現UPDATE + INSERT IGNOREUPDATE + INSERTINSERT … REPLACE等等。
  5. 在嘗試確定我是否可以使用其他一些子句時,MySQL 文件有點令人困惑。在MERGE語句中,我可以使用AND (TARGET.COLUMN_X > ‘VALUE’)
MERGE _TABLE A_ AS TARGET
WITH _TABLE B_ AS SOURCE
ON (TARGET.KEY = SOURCE.KEY)
WHEN MATCHED AND (TARGET.COLUMN_X > 'VALUE')
 UPDATE
   TARGET.COLUMN_A = SOURCE.COLUMN_A
...

我找不到如何在 MySQL 上執行此操作。

*注意事項

我必須對此進行管理以實現更好的時間結果和性能友好。

我有什麼設置:

  • PERCONA MySQL

    • txt文件,每個飛蛾都需要將新數據和一些更改上傳到表中(這就是為什麼我正在尋找類似MERGE的語句)
    • InnoDB MySQL 引擎
    • 關係數據庫表,因此我無法刪除或截斷目標表,因為它們都是相關的。

IODKU 是 MySQL 中最好的選項。它的工作原理是這樣的:

  1. 使用某個UNIQUE鍵(可能是集群的、唯一的PRIMARY KEY)來定位要修改的行。
  2. 如果沒有這樣的行,請執行INSERT.
  3. 如果有這樣的行,請執行UPDATE.

你不能比這更快。

請注意,第 1 步將記憶體 #2 或 #3 所需的所有內容到 buffer_pool。(嗯,好的,二級索引是通過“更改緩衝區”以“延遲”的方式處理的。)

進一步注意,該語句是原子的,而您的 2 語句替代項需要在事務中。

請記住,這REPLACEDELETE(0、1 或可能多行,如果您有多個唯一鍵),那麼INSERT. 請注意,AUTO_INCREMENT(如果使用)值將被丟棄並創建一個新值。

至於那個凌亂的查詢,它可能可以用GREATER()and/or IF()and/or來完成VALUES()。假設您嘗試合併多行,則需要 IODKU+SELECT 語法:

INSERT INTO Target (key, a)
   ON DUPLICATE KEY UPDATE
       SET a = VALUES(a) 
   SELECT Target.key, Target.a
       FROM Target
       JOIN Source ON Source.key = Target.key
       WHERE Target.x > 'value';

因為我不知道 MERGE 是做什麼的,所以我不能給你所有的細節。

引用自:https://dba.stackexchange.com/questions/147613