需要多次查询时,数据是先从数据库全部读取出来再查找快,还是一次次询问数据库快?【MySQL+Mybatis-plus】

给心急的小伙伴们先说结论: 先读到内存快。23W条数据,前者 3m7
s
完成,后者 1h 才完成,20倍的提升。

等等……点个赞再走 (ಥ_ಥ)


详细:

今天要实现一个功能。手上有一批图书数据,需要进行清洗再存入数据库的 book表

待清洗数据表项包含【 id,name,author_name,publisher_name】等

sql数据库中 book表 的表项包含【id,name,author_id(外键),publisher_id(外键)】等

问题来了,book表 存的是作者id和发布者的id,名字之类的数据存在其他对应的表。

目标很明确,业务流程清晰,就是先到mysql中的 author表publisher表 看看author_name和publisher_name是否存在,读出id或者新建id,然后和其他数据一起插入到 book表

我使用的环境是【MySQL+Mybatis-plus+AlibabaDruid】

最开始我只使用了BaseMapper接口提供的 selectOne()方法,每处理一条数据就到数据库读取一次 author 和 publisher

// 查询数据的代码
// s[5]是作者,s[7]是出版社, 从数据库获取两者的id
            String authorName = s[5].trim();
            QueryWrapper<Author> authorQueryWrapper = new QueryWrapper<>();
            authorQueryWrapper.select("author_id").eq("author_name",authorName).last("limit 1");
            Author author = authorMapper.selectOne(authorQueryWrapper);
            Integer authorId = author.getAuthorId();

            String publisherName = s[7].trim();
            QueryWrapper<Publisher> publisherQueryWrapper = new QueryWrapper<>();
            publisherQueryWrapper.select("publisher_id").eq("publisher_name",publisherName).last("limit 1");
            Publisher publisher = publisherMapper.selectOne(publisherQueryWrapper);
            Integer publisherId = publisher.getPublisherId();
            

插入方面我用了IService<>提供的批量插入saveBatch(bookList)方法。

速度很慢,花了一小时。
请添加图片描述
顶不住,改进了一下,一次性全把author表和publisher表读到内存,自己做个循环匹配。

上个厕所的时间就跑完了,总共3分钟。

请添加图片描述


至于原因,我猜测是因为节省了大量建立和关闭sql语句的时间的缘故。

  • 9
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Spring Boot + Mybatis + MySQL项目中,实现数据库数据同步到另外一个数据的功能,可以按照以下步骤进行: 1. 在项目中配置源数据库和目标数据库数据源。在application.properties文件中配置两个数据源的连接信息,如下所示: ``` # 源数据库连接信息 spring.datasource.source.url=jdbc:mysql://localhost:3306/source_db?useUnicode=true&characterEncoding=utf-8&useSSL=false spring.datasource.source.username=root spring.datasource.source.password=root # 目标数据库连接信息 spring.datasource.target.url=jdbc:mysql://localhost:3306/target_db?useUnicode=true&characterEncoding=utf-8&useSSL=false spring.datasource.target.username=root spring.datasource.target.password=root ``` 2. 在项目中创建Mybatis Mapper映射文件。在Mybatis Mapper映射文件中定义查询数据库数据和插入目标数据库数据SQL语句。 3. 在项目中创建一个Service组件,用于实现数据同步的功能。在该组件中,引入源数据库和目标数据库数据源,并使用Mybatis进行数据查询和插入。 4. 在Service组件中实现一个定任务,定期执行数据同步的操作。 示例代码如下: ``` @Service public class SyncService { @Autowired @Qualifier("sourceDataSource") private DataSource sourceDataSource; @Autowired @Qualifier("targetDataSource") private DataSource targetDataSource; @Autowired private SyncMapper syncMapper; @Scheduled(fixedDelay = 1000 * 60 * 60) // 每小同步一次 public void syncData() { // 查询数据库数据 List<SourceData> sourceDataList = syncMapper.listSourceData(); // 插入目标数据库数据 for (SourceData sourceData : sourceDataList) { TargetData targetData = new TargetData(); targetData.setId(sourceData.getId()); targetData.setName(sourceData.getName()); targetData.setValue(sourceData.getValue()); syncMapper.insertTargetData(targetData); } } } ``` 在上述示例代码中,我们创建了一个SyncService组件,使用@Autowired注解引入了源数据库和目标数据库数据源,以及SyncMapper映射文件。然后,在SyncService组件中实现了一个名为syncData的定任务,使用SyncMapper映射文件中的listSourceData和insertTargetData方法,进行数据查询和插入操作。 需要注意的是,在定任务中,我们可以使用Spring的@Scheduled注解来定期执行数据同步的操作。在本例中,我们设置了每小同步一次。另外,你需要在SyncMapper映射文件中定义listSourceData和insertTargetData方法,以便进行数据查询和插入操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值