需要多次查询时,数据是先从数据库全部读取出来再查找快,还是一次次询问数据库快?【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)方法。

速度很慢,花了一小时。
需要多次查询时,数据是先从数据库全部读取出来再查找快,还是一次次询问数据库快?【MySQL+Mybatis-plus】_第1张图片
顶不住,改进了一下,一次性全把author表和publisher表读到内存,自己做个循环匹配。

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

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


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

你可能感兴趣的:(MySQL那些事儿,mysql,数据库,database,java,mybatis)