数据结构相同情况下数据表之间数据的快速"copy"

本文介绍了在数据库中使用备份表来减轻主表压力的方法,并通过具体的案例探讨了如何避免循环操作,采用批量插入的方式提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在一个项目做得足够庞大时,也就是数据库的数据足够多时,会从某种程度上影响我们的查询速度。通常我们除了采用索引的方式来加快查询速度以外,
一般我们还会采用另一种方式来减轻我们数据库的压力。那就是——备份表。
备份表的想法,故名思义就是在数据库中建立数据结构相同的表,或者在另外一个数据库用户下面建立数据结构相同的表。
那么备份表中存放的通常是在当前系统中比较久远的或者已经没有太大用处的数据,但是为了保存数据或者相关的记录需要进行数据迁移到备份表中。

这里写图片描述

最简单的例子:用户表和课程表是一对一的关系。
假设,张三同学从某学校毕业,那么暂时他的信息在这个学校里面就用不上,所以将张三所涉及到的课程信息全部迁移到备份表中。

此时,我们最先想到的方法是:循环,根据用户名查出用户的ID,根据用户ID查出课程的所有信息,然后循环将所有的信息插入到t_course表中,
然后执行删除操作即可。

其实,数据库中还提供给我们一种操作这种相同数据结构表数据的方法:
insert into t_course_back(select * from t_course where user_id=?)
很显然这样的操作避免了大量数据时大量循环造成的资源和性能浪费。
那如果情况变了。。。

这里写图片描述

这个时候我的目标变了,我想要迁移的是t_course_info这张表。
你又想到了什么方法呢?
我会很快想到先根据user_id查询到t_courseType表的courseInfoId(显然这里必须用到循环了),
然后再根据t_courseType中的courseInfoId来逐条迁移t_course_info表。
显然这样又避免不了循环了。我曾经测试过,如果一对多的多的一面达到7000条数据以上,每个循环中再来一个批量的数据插入操作,
那你的电脑估计卡到那儿别想动弹了。。。
既然如此,我们就要想办法摒弃掉“循环”这个令人非常头疼的词,如何做呢?
当然还是要用到上面的那种方法。大家看:
insert into t_course_info_back(select ... from t_courseType t,t_course_info i 
where t.courseInofId=i.id where t.userid=? ) 
只看思路,这种思路可以巧妙的避开大数据的循环,避免死机。

小结:利用批量插入的sql语句可以避免简单的一对多造成的循环,但是遇到多重关系时,我们可以考虑结合普通的数据表关系来进行优化sql,
使查询效果更佳。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值