我一直在寻找这种比较或某种性能平衡。
到目前为止我所知道的是:
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 语法:因为我不知道 MERGE 是做什么的,所以我不能给你所有的细节。