MariaDB ColumnStore批量插入时处理重复ID并更新changed_at的最佳实践
最佳实践方案
方案一:添加唯一约束(优先推荐)
既然id是唯一标识,直接给ColumnStore表添加唯一键约束,就能利用ON DUPLICATE KEY UPDATE处理重复ID的场景,这是最简洁高效的方式:
- 先给
table_column添加唯一键:
ALTER TABLE table_column ADD UNIQUE KEY idx_id (id);
- 修改原插入语句为:
INSERT INTO table_column (id, ..., changed_at) SELECT id, ..., changed_at FROM table_row ON DUPLICATE KEY UPDATE changed_at = VALUES(changed_at);
这样当table_row中的id在table_column已存在时,只会更新对应的changed_at字段;不存在则插入全量行。
优缺点
- 优点:逻辑简洁,利用数据库原生冲突处理机制,原子性有保障,批量操作效率较高。
- 缺点:添加唯一键后,写入时会有唯一检查的开销,但MariaDB ColumnStore对唯一键的支持已做优化,常规批量场景下可忽略。
方案二:关联更新+插入(无需修改表结构)
如果无法添加约束,可分两步处理重复ID问题:
- 更新
table_column中与table_row重复的ID的changed_at:
UPDATE table_column c INNER JOIN table_row r ON c.id = r.id SET c.changed_at = r.changed_at;
- 插入
table_row中不存在于table_column的行:
INSERT INTO table_column (id, ..., changed_at) SELECT r.id, r...., r.changed_at FROM table_row r LEFT JOIN table_column c ON r.id = c.id WHERE c.id IS NULL;
建议将这两步放在同一个事务中,保证操作的原子性。
优缺点
- 优点:无需修改现有表结构,适配不能添加约束的场景。
- 缺点:需要两次独立操作,当数据量较大时,ColumnStore的行级更新性能低于InnoDB,整体效率不如方案一。
内容的提问来源于stack exchange,提问作者pavel
相关产品推荐
相关产品推荐

