免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4106 | 回复: 15
打印 上一主题 下一主题

【讨论中】MySQL表的更新变化 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-01-23 09:35 |只看该作者 |倒序浏览
本帖最后由 cenalulu 于 2013-01-24 11:42 编辑

我有一个MySQL的表(名为xxx),每天会从外部倒进一个txt文件来更新这张表。更新的情况包括:

有些记录的某些column值会更新为新的值;
新的记录会加进来;
有些记录会被删掉。

我们要求记录下上面这些更新的变化。我的想法是建立另一个同样的表(名为xxx_old),先把旧的数据copy到xxx_old中,清空xxx表,然后从txt文件load data到xxx表,接着比较xxx和xxx_old两个表的每个记录和column。还需要left join 和right join来找出哪些记录是新增的和删除的。

因为有好几十万条记录和几百个column,这样比较会花较长时间。请问各位高手有什么更好的建议吗?

先谢谢了!

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
2 [报告]
发表于 2013-01-23 10:14 |只看该作者
没研究过有没有相应的日志,lz 可以去找找 mysql 文档关于日志方面的内容。
另外我觉得触发器应该可以达成你的需求,所以建议也可以看看这个方面的内容。

论坛徽章:
0
3 [报告]
发表于 2013-01-24 06:12 |只看该作者
本帖最后由 q15928 于 2013-01-24 06:13 编辑

回复 2# seesea2517

谢谢!外部要倒进的txt文件实际上是包含了整个表的数据,但可能每天更改的内容只有5%左右。如果用触发器的话,我需要先比较现有表的数据和txt文件,然后找出需要UPDATE, ADD, DELETE的记录来更新现有表。这样的话,需要用脚本来实现数据比较吧?

我原先的想法是看看MySQL里面是否有更好的方法来实现两个相同定义的表的内容的比较。
   

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
4 [报告]
发表于 2013-01-24 11:00 |只看该作者
回复 3# q15928

   
我原先的想法是看看MySQL里面是否有更好的方法来实现两个相同定义的表的内容的比较。

我也不大了解这些,估计是没有吧。

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
5 [报告]
发表于 2013-01-24 11:42 |只看该作者
其实我觉得把老表dump成文件,在文件层面做diff会比在数据库要高效。

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
6 [报告]
发表于 2013-01-25 10:38 |只看该作者
回复 5# cenalulu


    嗯,反正都是要全表比较,数据库的索引优势用不到。

论坛徽章:
0
7 [报告]
发表于 2013-01-25 12:57 |只看该作者
回复 5# cenalulu

谢谢!那我会试试用Perl写脚本来做比较。。。

   

论坛徽章:
0
8 [报告]
发表于 2013-01-25 13:14 |只看该作者
q15928 发表于 2013-01-23 09:35
我有一个MySQL的表(名为xxx),每天会从外部倒进一个txt文件来更新这张表。更新的情况包括:

有些记录的 ...


问题:通过什么条件筛选,主键吗?主键是自增的还是其他规则?
有些记录的某些column值会更新为新的值;
新的记录会加进来;
有些记录会被删掉。

论坛徽章:
0
9 [报告]
发表于 2013-01-27 12:03 |只看该作者
G8bao7 发表于 2013-01-25 13:14
问题:通过什么条件筛选,主键吗?主键是自增的还是其他规则? ...

是通过主键来比较每一row,主键不是自增的,包含好几个不同的Id,都是数字的。

论坛徽章:
0
10 [报告]
发表于 2013-01-27 20:53 |只看该作者
q15928 发表于 2013-01-27 12:03
是通过主键来比较每一row,主键不是自增的,包含好几个不同的Id,都是数字的。


主键不是自增确实比较麻烦了,自己的一些思路,欢迎拍砖

前提,表中除了主键没有其他唯一索引
把数据拆分成两部分,read(只包含update不更新的列)和update(只包含update时会更新的列)

select * from old_read as or,old_update as ou where or.pk=ou.pk
1、新增、更新
     insert ignore into old_read select * from new_read;  #主键冲突的行是不会插入
     replace into old_update select * from new_update;   #主键冲突的行会被替换

-- 查看处理后的sql
select * from old_read as or,old_update as ou where or.pk=ou.pk


2、有些记录会被删掉。====疑问:什么条件的行需要被删除
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP