mybatis-plus对列表中数据进行查询的性能比较

测试代码

共准备了以下几个测试代码:

  1. 空白对照
public List<User> test0() {
    return new ArrayList<>();
}
  1. for循环遍历
public List<User> test1(@RequestBody List<Integer> ids) {
    List<User> list = new ArrayList<>();
    for (Integer id : ids) {
        list.add(userService.getById(id));
    }
    return list;
}
  1. listByIds
public List<User> test2(@RequestBody List<Integer> ids) {
    return userService.listByIds(ids);
}
  1. mapper中的foreach
// controller
public List<User> test3(@RequestBody List<Integer> ids) {
    return userService.selectByIds(ids);
}
// mapper
@Select("<script>" +
            "select * from user where id in " +
                "<foreach collection='list' item='item' open='(' separator=',' close=')'>" +
                    "#{item}" +
                "</foreach>" +
        "</script>")
List<User> selectByIds(@Param("list") List<Integer> ids);

测试结果

n为ids的长度,使用postman发送请求,各接口响应时间如下:

n test0 test1 test2 test3
1 214ms 260ms 260ms 260ms
2 214ms 302ms 260ms 260ms
10 214ms 655ms 260ms 260ms
40 214ms 2.08s 260ms 260ms
240 214ms 10.71s 261ms 261ms
1000 214ms - 267ms 267ms

测试结论

空白对照基本可以看做除去数据库查询以外的其他时间,减去这段时间后,可以看出本次实验环境下一次数据库查询的时间大概为40ms左右。使用mybatis的listByIds和foreach的时间基本相同,因为无论n为多少,都只会执行一次数据库查询。而使用for循环反复创建数据库连接的开销太大。

posted @ 2023-04-26 08:31  longxiaoming  阅读(162)  评论(0编辑  收藏  举报