DUPLICATE KEY 用什么替换比较好

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】

INSERT INTO
  `t_order` (
    `id`,
  )
VALUES
  (...),
  (...),
  (...),
  (...),
  (...),
  (...),
  (...),
  (...),
  (...),
  (...) ON DUPLICATE KEY
UPDATE
  `avail` = IF (
    VALUES
      (`version`) > `version`,
    VALUES
      (`avail`),
      `avail`
  ),
  `iso_avail` = IF (
    VALUES
      (`version`) > `version`,
    VALUES
      (`iso_avail`),
      `iso_avail`
  ),
  `iso_hold` = IF (
    VALUES
      (`version`) > `version`,
    VALUES
      (`iso_hold`),
      `iso_hold`
  ),
  `trd_hold` = IF (
    VALUES
      (`version`) > `version`,
    VALUES
      (`trd_hold`),
      `trd_hold`
  ),
  `non_trd_hold` = IF (
    VALUES
      (`version`) > `version`,
    VALUES
      (`non_trd_hold`),
      `non_trd_hold`
  ),
  `net_debt` = IF (
    VALUES
      (`version`) > `version`,
    VALUES
      (`net_debt`),
      `net_debt`
  ),
  `u_time` = IF (
    VALUES
      (`version`) > `version`,
    VALUES
      (`u_time`),
      `u_time`
  ),
  `state` = IF (
    VALUES
      (`version`) > `version`,
    VALUES
      (`state`),
      `state`
  ),
  `eq` = IF (
    VALUES
      (`version`) > `version`,
    VALUES
      (`eq`),
      `eq`
  ),
  `net_mgn` = IF (
    VALUES
      (`version`) > `version`,
    VALUES
      (`net_mgn`),
      `net_mgn`
  ),
  `order_lost` = IF (
    VALUES
      (`version`) > `version`,
    VALUES
      (`order_lost`),
      `order_lost`
  ),
  `asset_value` = IF (
    VALUES
      (`version`) > `version`,
    VALUES
      (`asset_value`),
      `asset_value`
  ),
  `debt` = IF (
    VALUES
      (`version`) > `version`,
    VALUES
      (`debt`),
      `debt`
  ),
  `mm` = IF (
    VALUES
      (`version`) > `version`,
    VALUES
      (`mm`),
      `mm`
  ),
  `upl` = IF (
    VALUES
      (`version`) > `version`,
    VALUES
      (`upl`),
      `upl`
  ),
  `version` = IF (
    VALUES
      (`version`) > `version`,
    VALUES
      (`version`),
      `version`
  )

:thinking:重复不更新的话用insert ignore into

如果表中有UK的话,可以考虑用replace into命令

使用 SELECT 语句和 WHERE 子句来确定哪些行应该被更新。
根据第一步的结果,构建一个只包含需要更新的行的 INSERT … ON DUPLICATE KEY UPDATE 语句。

上面三位的方式都可以,另一种就是在前端处理掉

insert ignore into,这个可以,我们用过

replace into好像不建议用,有性能问题

在冲突比较少的情况下replace写入性能好像还可以,两三万很轻松

对,我记得之前搜过,某些情况下是有问题,但总体还是不错的

replace into吧,即把sql改成如下语句:

REPLACE INTO
  `t_order` (
    `id`,
  )
VALUES
  (...),
  (...),
  (...),
  (...),
  (...),
  (...),
  (...),
  (...),
  (...),
  (...) 

不过性能不知道如何,你可以测试下

insert into on duplicate key xx方式可行么?

这个你直接百度区别,和mysql一致的

可行,主要看场景,这几种方式我们都有在用

TiDB Lightning的tidb模式也是采用replace进行分批数据导入,看着每个批一般在1000条左右,但是对比大表的数据导入对CPU的使用率还是有明显影响。

这种方式在并发和并行场景下,要注意避免冲突,一旦冲突多,很容易出现锁相关的问题,对性能影响也比较大。