需要多次查询时,数据是先从数据库全部读取出来再查快,还是⼀次次询问数
据库快?【MySQL。。。
给⼼急的⼩伙伴们先说结论: 先读到内存快。23W条数据,前者 3m7
s 完成,后者 1h 才完成,20倍的提升。
等等……点个赞再⾛ (_)
详细:
今天要实现⼀个功能。⼿上有⼀批图书数据,需要进⾏清洗再存⼊数据库的 book表 。
待清洗数据表项包含【 id,name,author_name,publisher_name】等
sql数据库中 book表 的表项包含【id,name,author_id(外键),publisher_id(外键)】等
问题来了,book表 存的是作者id和发布者的id,名字之类的数据存在其他对应的表。
mysql下载到了c盘⽬标很明确,业务流程清晰,就是先到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 = AuthorId();
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 = PublisherId();
插⼊⽅⾯我⽤了IService<>提供的批量插⼊saveBatch(bookList)⽅法。
速度很慢,花了⼀⼩时。
顶不住,改进了⼀下,⼀次性全把author表和publisher表读到内存,⾃⼰做个循环匹配。
上个厕所的时间就跑完了,总共3分钟。
⾄于原因,我猜测是因为节省了⼤量建⽴和关闭sql语句的时间的缘故。