巧用 FindInBatches
date
Sep 12, 2023
slug
Gorm-FindInBatches-Use-Example
status
Published
tags
Gorm
PostgreSQL
summary
使用 FindInBatches 进行批量查询
type
Post
Created Time
Oct 28, 2023 01:45 PM
Updated Time
Oct 28, 2023 01:45 PM
AI summary
使用
gorm.FindInBatches
进行分批查询可以减少内存消耗、提高响应速度、更好的数据库性能和灵活的业务处理。但是,查询结果的顺序可能不确定,需要额外的代码处理,可能导致数据库锁定。Status
Done
在进行数据量较多的查询时,有时,没有办法把所有数据一次性全部查出来,比如,现在有一个场景,需要将一张表中的一千万条数据,迁移至另一张表中,更有效的做法是在一个事务里,使用批量查询的方式,分批进行迁移,Gorm 提供了 FindInBatches 这个语法糖,官方的例子如下(为了方便测试,我将每次查询的条数限制为 2):
在实际的执行过程中,具体的查询如下:
由此可见,在分批查询的过程中,Gorm 是使用 id 作为查询条件和 LIMIT 进行结合,最终获得完成的查询结果的。
使用
gorm.FindInBatches
进行分批查询有如下好处:好处:
- 减少内存消耗:当你需要处理大量数据时,一次性获取所有结果可能会导致内存不足。使用
FindInBatches
将结果分成多个批次,每次只获取一部分数据,可以减少内存占用,提高程序的性能和稳定性。
- 提高响应速度:分批查询可以提高查询的响应速度。每次从数据库获取一小批数据,可以更快地将部分结果返回给应用程序,从而减少整个查询的执行时间。
- 更好的数据库性能:分批查询可以减轻数据库的负载。将大型查询拆分成多个小查询可以减少数据库服务器的负荷,提高整体的数据库性能。
- 灵活的业务处理:分批查询的结果,在每一批结果查询之后,都可以继续进行子查询或者其他操作。
当然,也有一些缺点:
- 查询结果的顺序可能不确定:由于分批查询是将结果分成多个批次处理,每个批次的数据顺序可能不同,因此在获取结果时可能无法保持原始的排序。如果你需要有序的结果集,可能需要在应用程序中进一步处理。
- 需要额外的代码处理:使用
FindInBatches
进行分批查询需要编写额外的代码来处理每个批次的结果。这可能需要更多的开发工作和代码维护。
- 可能导致数据库锁定:在某些情况下,分批查询可能导致数据库记录被锁定的时间更长。