Sql-Server
SQL Server Merge vs MySQL Insert On Duplicate Key 性能比較
我一直在尋找這種比較或某種性能平衡。
到目前為止我所知道的是:
- MERGE是已經在 SQL Server 上實現的T-SQL命令。據我所知,它的性能非常好,因為它使用“有點像” INNER JOIN雜湊映射來插入和更新,但是在使用CLUSTERED INDEX時,我在同一個****MERGE語句上刪除時也遇到了一些問題. 除此之外,它非常快,讓我在更新或插入某些東西之前做一些比較子句,所以對我來說非常靈活。
- 在 SQL Server 中,某些特定場景寧願將UPDATE和INSERT用作單獨的語句,我不反對。在我短暫的經驗中,我會預設使用MERGE作為我的程式碼的標準。
- 現在作為一名 DBA,我面臨著一個新的挑戰,我還必須管理 MySQL 伺服器,所以我最終在 MySQL 中尋找類似的MERGE行為來提高查詢的性能。到目前為止,除了INSERT … ON DUPLICATE KEY … UPDATE之外,我沒有發現任何相似之處。儘管如此,我還是有一些性能問題,因為我不確定它在伺服器上的表現如何,它是如何工作的,以及可選的語句對是否會比這更好或更快地工作。
- 在 MySQL 中環顧四周,我發現UPDATE + INSERT IGNORE、UPDATE + INSERT、INSERT … REPLACE等等。
- 在嘗試確定我是否可以使用其他一些子句時,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 中最好的選項。它的工作原理是這樣的:
- 使用某個
UNIQUE
鍵(可能是集群的、唯一的PRIMARY KEY
)來定位要修改的行。- 如果沒有這樣的行,請執行
INSERT
.- 如果有這樣的行,請執行
UPDATE
.你不能比這更快。
請注意,第 1 步將記憶體 #2 或 #3 所需的所有內容到 buffer_pool。(嗯,好的,二級索引是通過“更改緩衝區”以“延遲”的方式處理的。)
進一步注意,該語句是原子的,而您的 2 語句替代項需要在事務中。
請記住,這
REPLACE
是DELETE
(0、1 或可能多行,如果您有多個唯一鍵),那麼INSERT
. 請注意,AUTO_INCREMENT
(如果使用)值將被丟棄並創建一個新值。至於那個凌亂的查詢,它可能可以用
GREATER()
and/orIF()
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 是做什麼的,所以我不能給你所有的細節。