【比较mybatis、lazy、sqltoy、mybatis-flex、easy-query操作数据】操作批量新增、分页查询(三)
orm框架使用性能比较
比较mybatis、lazy、sqltoy、mybatis-flex、easy-query操作数据
环境:
idea
jdk17
spring boot 3.0.7
mysql 8.0
测试条件常规对象
orm 框架 | 是否支持xml | 是否支持 Lambda | 对比版本 |
---|---|---|---|
mybatis | ☑️ | ☑️ | 3.5.4 |
sqltoy | ☑️ | ☑️ | 5.2.98 |
lazy | ✖️ | ☑️ | 1.2.4-JDK17-SNAPSHOT |
mybatis-flex | ☑️ | ☑️ | 1.8.0 |
easy-query | ✖️ | ☑️ | 1.10.31 |
数据库表(含有唯一性索引s_u)
CREATE TABLE `sys_user`
(`column_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '额外字段',`create_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',`id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID',`is_deleted` tinyint(1) DEFAULT NULL COMMENT 'null',`password` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '密码',`scope` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT 'null',`status` tinyint(1) DEFAULT NULL COMMENT '状态',`update_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',`username` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '用户名',PRIMARY KEY (`id`) USING BTREE,UNIQUE KEY `s_u` (`scope`,`username`)
) ENGINE=InnoDB AUTO_INCREMENT=9223371632070323791 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
比较方法:增加、修改、删除、分页查询(当前项目暂时只比较批量新增和分页)
项目设计
-
声明 ORMRepository 接口提供对应增删改查方法
-
声明 ORMComparisonRepository接口 继承 ORMRepository 下游由不同ORM实现
-
声明 SysUserRepository 接口 继承 ORMRepository 用于循环调用不同orm实现方法执行方法测试产生测试结果
-
声明抽象类 SysUserRepositoryAbstractRecord 继承 ORMComparisonRepository 并且提供对应的框架执行结果存储
-
不同ORM框架mybatis、sqltoy、Lazy、easy-query 创建 ORMComparisonRepository 的实现
- 不同 ORM 操作数据的实现在
测试条件 批量插入数据 10、100、1000、10000、100000 ,分页查询数据 10、100、1000、10000、100000
项目启动后使用浏览器打开 http://localhost:1003/sys/user/run-compare
测试条件(细节比较) 批量插入数据 1~10000,分页查询数据 1~10000
项目启动后使用浏览器打开 http://localhost:1003/sys/user/run-particulars-compare
测试执行过程
清空需要插入表中所有数据
通过三种ORM框架进行数据批量新增、而后进行分页查询,记录消耗时间,输出md文档
查看结果曲线图
测试结果(结果只提供参考)
MYBATIS_FLEX(batchStory) | 影响行数:10 | 影响行数:100 | 影响行数:1000 | 影响行数:10000 | 影响行数:100000 |
---|---|---|---|---|---|
执行时间: | 3毫秒 | 11毫秒 | 61毫秒 | 633毫秒 | 6985毫秒 |
MYBATIS(batchStory) | 影响行数:10 | 影响行数:100 | 影响行数:1000 | 影响行数:10000 | 影响行数:100000 |
---|---|---|---|---|---|
执行时间: | 6毫秒 | 8毫秒 | 59毫秒 | 733毫秒 | 7136毫秒 |
LAZY(batchStory) | 影响行数:10 | 影响行数:100 | 影响行数:1000 | 影响行数:10000 | 影响行数:100000 |
---|---|---|---|---|---|
执行时间: | 8毫秒 | 9毫秒 | 39毫秒 | 385毫秒 | 3987毫秒 |
EASY_QUERY(batchStory) | 影响行数:10 | 影响行数:100 | 影响行数:1000 | 影响行数:10000 | 影响行数:100000 |
---|---|---|---|---|---|
执行时间: | 31毫秒 | 57毫秒 | 311毫秒 | 1956毫秒 | 20898毫秒 |
SQLTOY(batchStory) | 影响行数:10 | 影响行数:100 | 影响行数:1000 | 影响行数:10000 | 影响行数:100000 |
---|---|---|---|---|---|
执行时间: | 8毫秒 | 26毫秒 | 183毫秒 | 1610毫秒 | 18832毫秒 |
MYBATIS_FLEX(findPage) | 影响行数:10 | 影响行数:100 | 影响行数:1000 | 影响行数:10000 | 影响行数:100000 |
---|---|---|---|---|---|
执行时间: | 10毫秒 | 19毫秒 | 30毫秒 | 100毫秒 | 668毫秒 |
MYBATIS(findPage) | 影响行数:10 | 影响行数:100 | 影响行数:1000 | 影响行数:10000 | 影响行数:100000 |
---|---|---|---|---|---|
执行时间: | 1231毫秒 | 888毫秒 | 1114毫秒 | 819毫秒 | 838毫秒 |
LAZY(findPage) | 影响行数:10 | 影响行数:100 | 影响行数:1000 | 影响行数:10000 | 影响行数:100000 |
---|---|---|---|---|---|
执行时间: | 8毫秒 | 7毫秒 | 17毫秒 | 196毫秒 | 675毫秒 |
EASY_QUERY(findPage) | 影响行数:10 | 影响行数:100 | 影响行数:1000 | 影响行数:10000 | 影响行数:100000 |
---|---|---|---|---|---|
执行时间: | 15毫秒 | 5毫秒 | 18毫秒 | 96毫秒 | 638毫秒 |
SQLTOY(findPage) | 影响行数:10 | 影响行数:100 | 影响行数:1000 | 影响行数:10000 | 影响行数:100000 |
---|---|---|---|---|---|
执行时间: | 36毫秒 | 35毫秒 | 37毫秒 | 86毫秒 | 229毫秒 |
写在最后
细节数据对比(一万以内基本相差不大)
批量保存:
- 一万条数据以内 性能由高到低 mybatis-flex 、mybatis、lazy 性能趋于一致 sqltoy、easy-query 耗时出现明显起伏
- 十万数据时,处理时间由快到慢依次是: lazy、mybatis、mybatis-flex、easy-query、sqltoy
分页查询:
- 一万条数据以内 性能由高到低 lazy、mybatis-flex 、sqltoy、easy-query、mybatis
- 十万数据时,处理时间由快到慢依次是: sqltoy、lazy、mybatis-flex、easy-query、mybatis
快速数据对比
当前项目地址
lazy-orm地址
mybatis地址
sqltoy地址
mybatis-flex地址
easy-query地址
相关文章:

【比较mybatis、lazy、sqltoy、mybatis-flex、easy-query操作数据】操作批量新增、分页查询(三)
orm框架使用性能比较 比较mybatis、lazy、sqltoy、mybatis-flex、easy-query操作数据 环境: idea jdk17 spring boot 3.0.7 mysql 8.0测试条件常规对象 orm 框架是否支持xml是否支持 Lambda对比版本mybatis☑️☑️3.5.4sqltoy☑️☑️5.2.98lazy✖️☑️1.2.4…...
Leetcode 3068. Find the Maximum Sum of Node Values
Leetcode 3068. Find the Maximum Sum of Node Values 1. 解题思路2. 代码实现 题目链接:3068. Find the Maximum Sum of Node Values 1. 解题思路 这一题虽然标记为一道hard的题目,但其实就是一个脑筋急转弯的题目。 我们只需要想明白一点即可&…...
用 Dockerfile为镜像添加SSH服务
1、基础镜像ubuntu:18.04 2、替换为国内的安装源 3、安装openssh-server 4、允许root用户远程登陆 5、暴露端口22 6、服务开机自启动 1.创建目录 [rootopenEuler-node1 db]# mkdir sshd_ubuntu 2.创建 Dockerfile、 run.sh 、authorized_keys、vim aliyun.list 文件 [rootop…...
Maven能解决什么问题?为什么要用?
如果没有maven,我们在开发一个应用的时候,需要自己先确定要引入哪些第三方的jar包,并且要去找到这些jar包,把他们导入到项目中,而且最痛苦的时候各个jar包之间的兼容性和冲突的问题。 jar包弄好了之后,我们…...
【Golang星辰图】探索网络和HTTP的奇妙世界:使用Go语言打造高性能应用
提升Web开发效率:学会使用Go语言的网络和HTTP库 前言 随着互联网的快速发展,网络和HTTP成为了现代应用开发中必不可少的部分。Go语言作为一门快速、可靠和高效的编程语言,提供了丰富的网络编程和HTTP处理库,使得构建高性能的网络…...
[C语言]——操作符
目录 一.算术操作符:、-、*、/、% 1. 和 - 2.* 3./ 4.% 二.赋值操作符:和复合赋值 1.连续赋值 2.复合赋值符 三.单目操作符:、--、、- 1.和-- 1.1前置 1.2后置 1.3前置-- 2. 和 - 四.强制类型转换 一.算术操作符:…...

iview碰到的一些问题总结
iview tabs嵌套使用问题 tabs嵌套使用的时候不是直接套用行了,直接套用会出现内层tab都集成到一级tab去,需要设置该属性指向对应 Tabs 的 name 字段(需要版本大于3.3.1) <Tabs name"tab1" ><TabPane label"标签1" tab&qu…...

【Python笔记-FastAPI】后台任务+WebSocket监控进度
目录 一、代码示例 二、执行说明 (一) 调用任务执行接口 (二) 监控任务进度 实现功能: 注册后台任务(如:邮件发送、文件处理等异步场景,不影响接口返回)监控后台任务执行进度(进度条功能)支…...

力扣hot100:15.三数之和(双指针/哈希表)
分析: 三数和问题,这里和两数之和不一样,返回的是值,因此可以对其进行排序,使用双指针。 一、一层循环双指针 class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {sort…...

VMware虚拟机使用Windows共享的文件夹
虚拟机版本为 VMware Workstation 16 Pro:16.2.4;主机位Windows11;记录于2024-03-05 在个人使用时,经常会有一些数据集等大文件重复在不同实验中使用,但是不同系统中来回使用会导致占用虚拟机空间,该博文通过将主机…...

利用Python自动化日常任务
在快节奏的现代生活中,时间就是一切。幸运的是,Python提供了一系列强大的库和工具,可以帮助我们自动化那些乏味且重复的任务,从而释放我们的时间,让我们可以专注于更有创造性和有意义的工作。下面,我们将探…...
Android的多线程和异步处理
在Android开发中,多线程和异步处理是处理耗时操作、提高应用响应性和性能的关键技术。以下是一些关于Android多线程和异步处理的基本概念和实践: 1. **主线程(UI线程)**: - Android应用的主线程负责处理UI操作和事…...

MySQL-----视图
一 视图 ▶ 介绍 视图view是一个虚拟表,非真实存在,其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用视图名称即可获取结果集,并可以将其当作表来使用。 数据库中存放了视图的定义&…...

LeetCode-02
225. 用队列实现栈 用两个队列实现栈的功能,思路如下: 往空队列中放新元素把非空队列中的元素依次放入刚才添加了新元素的队列,直到非空队列变为空队列 class MyStack(object):def __init__(self):self.queue1 []self.queue2 []def push(…...

瑞_Redis_Redis的Java客户端
文章目录 1 Redis的Java客户端1.1 Jedis快速入门1.1.1 入门案例1.1.1.1 项目构建1.1.1.2 引入依赖1.1.1.3 建立连接1.1.1.4 释放资源1.1.1.5 测试1.1.1.6 完整测试类代码 1.1.2 Jedis连接池1.1.2.1 连接池工具类1.1.2.2 改造原始代码 1.2 SpringDataRedis1.2.1 RedisTemplate1.…...

Cmake的使用
第一步:安装Cmake 双击点开即可,无脑下一步。 第二步:编写一个简单的Cmake项目 CMakeLists.txt文件 # 设置最低的 CMake 版本要求 cmake_minimum_required(VERSION 3.10)# 设置项目名称 project(MyProject)# 添加可执行文件 add_executabl…...
linux系统ELK组件介绍
ELK组件介绍 ELK组件介绍Elasticsearch:Logstash:Kibana:Kafka: Filebeat: ELK 官网地址:https://www.elastic.co 官网搭建:https://www.elastic.co/guide/index.html 组件介绍 Elasticsearch: 是一个基于Lucene的搜…...

回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测
回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测 目录 回归预测 | Matlab实现BiTCN基于双向时间卷积网络的数据回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现BiTCN基于双向时间卷积网络的数据回归预测(完整源码和数据&a…...
Tailscale中继服务derper使用docker-compose部署
docker启动 docker run --restart always \--name derper -p 12345:12345 -p 3478:3478/udp \-v /root/.acme.sh/xxxx/:/app/certs \-e DERP_CERT_MODEmanual \-e DERP_ADDR12345 \-e DERP_DOMAINxxxx \-d ghcr.io/yangchuansheng/derper:latestdocker-compose启动 version: …...

Spring Cloud 实战系列之 Zuul 微服务网关搭建及配置
一、创建SpringBoot项目 用mavan搭建也可以。(重要的是后面pom里应该引入那些依赖,application.yml怎么配置) 由于开始构建项目时选择了Eureka Server,所以pom.xml中不需要手动添加依赖了 首先在启动类SpringcloudApplicatio…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

2021-03-15 iview一些问题
1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
Python Einops库:深度学习中的张量操作革命
Einops(爱因斯坦操作库)就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库,用类似自然语言的表达式替代了晦涩的API调用,彻底改变了深度学习工程…...
规则与人性的天平——由高考迟到事件引发的思考
当那位身着校服的考生在考场关闭1分钟后狂奔而至,他涨红的脸上写满绝望。铁门内秒针划过的弧度,成为改变人生的残酷抛物线。家长声嘶力竭的哀求与考务人员机械的"这是规定",构成当代中国教育最尖锐的隐喻。 一、刚性规则的必要性 …...
计算机系统结构复习-名词解释2
1.定向:在某条指令产生计算结果之前,其他指令并不真正立即需要该计算结果,如果能够将该计算结果从其产生的地方直接送到其他指令中需要它的地方,那么就可以避免停顿。 2.多级存储层次:由若干个采用不同实现技术的存储…...

C# WPF 左右布局实现学习笔记(1)
开发流程视频: https://www.youtube.com/watch?vCkHyDYeImjY&ab_channelC%23DesignPro Git源码: GitHub - CSharpDesignPro/Page-Navigation-using-MVVM: WPF - Page Navigation using MVVM 1. 新建工程 新建WPF应用(.NET Framework) 2.…...