我需要更新一个有大量来自客户端的读取请求的大表(100k行)。
我需要遍历表格的每一行并检查数据是否过时。如果该行已过时,则使用新数据覆盖,否则忽略并转到下一行。
我现在可以想到两种策略。
使用UPDATE
- s创建一个逐行(或一批行)遍历表的后台进程。不会锁定整个表格,但速度很慢。
根据新数据创建新表。锁定旧桌子片刻。删除旧表。将新表重命名为旧表。
本质:
CREATE TABLE fresh;
LOCK TABLE old IN EXCLUSIVE MODE;
DROP TABLE old;
ALTER TABLE fresh RENAME TO old;
我应该怎么做?第二种策略是否有效并且是线程安全的吗?
答案 0 :(得分:1)
您可以创建一个表的视图并在sql查询中使用该视图。当您创建一个新表并填充数据时,您只需重新创建一个包含新表的视图。
答案 1 :(得分:1)
只要更新会话是表中唯一的编写者,第二种方法就是安全的。
我想说在这种情况下这是更好的方法。我认为优点是:
如果出现问题,可以轻松回滚更新(只需删除表格副本)。
因此,如果更新中断,您不必花时间考虑重启方案。
没有表格臃肿。
缺点是您可能需要更多空间。