SQLite性能测试(插入)

最近一直在思考一个问题,SQLite 做到这么轻量级,那它注定不会像 MySql 一样强性能,那么它的性能怎么样呢?并发量多高呢?

官方解释:

About SQLite

最大数据库大小:281TB

最大行大小:1GB

请添加图片描述

话不多说,操作!

创建数据库&表

新建db文件,作为存储数据库

请添加图片描述

创建user表,作为测试数据表

CREATE TABLE "user" (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,age INTEGER NOT NULL
);

新建测试demo

新建maven项目,引入相关依赖

<dependency><groupId>org.xerial</groupId><artifactId>sqlite-jdbc</artifactId><version>3.36.0.3</version>
</dependency>

新建测试case

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class SqliteInsertExample {public static void main(String[] args) {String url = "jdbc:sqlite:D:\\env\\SQLite\\data\\user.db";String tableName = "user"; try (Connection conn = DriverManager.getConnection(url);PreparedStatement pstmt = conn.prepareStatement(//插入sql"INSERT INTO " + tableName + " (name, age) VALUES (?,?)")) {pstmt.setString(1, "张三");pstmt.setString(2, "20");// 记录执行开始时间double startTime = System.currentTimeMillis();//执行插入操作int rowsInserted = pstmt.executeUpdate();//记录执行结束时间double endTime = System.currentTimeMillis();double duration = endTime - startTime;if (rowsInserted > 0) {System.out.println("Inserted successfully!");System.out.println("执行时间为:"+duration/1000+"s");}} catch (SQLException e) {System.out.println(e.getMessage());}}
}

执行测试

  1. 插入一条记录,执行时间 0.002s,感觉还不错,基本无感😎

请添加图片描述

  1. 修改代码,循环插入 1000 条记录,再次测试
//执行插入操作
int rowsInserted = 0;
for (int i = 0; i < 1000; i++) {rowsInserted = pstmt.executeUpdate();
}

1.6s 左右,还是相当可以

请添加图片描述

  1. 加大力度继续测试,循环插入100,0000 条记录
 for (int i = 0; i < 1000000; i++) {rowsInserted = pstmt.executeUpdate();}

漫长的等待…

这次测试明显不乐观,时长达到了26分钟😥

请添加图片描述

  1. 换个思路——模拟并发开辟几个线程,在多线程下循环插入数据
 public class SqliteInsertExample{public static void main(String[] args) {MyRunnable myRunnable = new MyRunnable();Thread thread1 = new Thread(myRunnable);Thread thread2 = new Thread(myRunnable);Thread thread3 = new Thread(myRunnable);Thread thread4 = new Thread(myRunnable);Thread thread5 = new Thread(myRunnable);//开启线程thread1.start();thread2.start();thread3.start();thread4.start();thread5.start();}
}
//线程类class MyRunnable implements Runnable{//插入数据库的代码...}

报错了…5个线程失败两个,在 sql 执行期间会有表锁,看来显然不能这么简单处理

请添加图片描述

如果一个线程执行完毕后,再启用下一个线程,那么我模拟的多并发就没有了意义

与MySQL做个对比

在刚刚测试中循环插入一百万条数据,执行时长长达26分钟,属实是有些恐怖,那么一样的操作一样的环境,换成 mysql (5.7版本) 会有什么样的结果呢?

引入依赖

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version>
</dependency>

创建库表

 CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(100) NOT NULL,`age` varchar(100) NOT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

新建测试case

 import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.SQLException;public class MysqlInsertExample {public static void main(String[] args) {// JDBC 驱动名和数据库 URLString JDBC_DRIVER = "com.mysql.cj.jdbc.Driver";String DB_URL = "jdbc:mysql://localhost/user";// 数据库的用户名与密码String USER = "root";String PASS = "123456";try {//加载并注册JDBC驱动Class.forName(JDBC_DRIVER);Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);//插入sqlString sql = "INSERT INTO user (name, age) VALUES (?, ?)";PreparedStatement pstmt = conn.prepareStatement(sql);// 设置占位符的值pstmt.setString(1, "李四");pstmt.setString(2, "30");// 记录执行开始时间double startTime = System.currentTimeMillis();//执行插入操作int rowsAffected = 0;for (int i = 0; i < 1000000; i++) {rowsAffected = pstmt.executeUpdate();}//记录执行结束时间double endTime = System.currentTimeMillis();double duration = endTime - startTime;if (rowsAffected > 0) {System.out.println("Inserted successfully!");System.out.println("执行时间为:" + duration / 1000 + "s");}//清理环境,关闭连接pstmt.close();conn.close();} catch (ClassNotFoundException e) {// JDBC 驱动类没有找到e.printStackTrace();} catch (SQLException e) {// 处理 JDBC 错误e.printStackTrace();}}}

7分钟左右,看来还得是MySQL,性能不是一个量级

在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/690547.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C语言题解】输入n(1~9),再输入n个长度不超过50的字符串,给这n个字符串排序并输出它们

&#x1f970;欢迎关注 轻松拿捏C语言系列&#xff0c;来和 小哇 一起进步&#xff01;✊ &#x1f308;感谢大家的阅读、点赞、收藏和关注 解题思路&#xff1a; 首先&#xff1a;使用一个二维字符数组来存储输入的字符串。由于n的范围是1到9&#xff0c;我们可以直接定义一…

进程间通信:连接不同程序世界的桥梁

目录 一、进程间通信的重要性 二、常见的进程间通信方式 三、进程间通信的目的 四、进程间通信的本质 在计算机编程的领域中&#xff0c;进程间通信&#xff08;Inter-Process Communication&#xff0c;IPC&#xff09;是一个至关重要的概念。当我们在操作系统中运行多个程…

Golang | Leetcode Golang题解之第83题删除排序链表中的重复元素

题目&#xff1a; 题解&#xff1a; func deleteDuplicates(head *ListNode) *ListNode {if head nil {return nil}cur : headfor cur.Next ! nil {if cur.Val cur.Next.Val {cur.Next cur.Next.Next} else {cur cur.Next}}return head }

基于Python+Django+MySQL实现Web版的增删改查

Python Web框架Django连接和操作MySQL数据库学生信息管理系统(SMS),主要包含对学生信息增删改查功能&#xff0c;旨在快速入门Python Web。 开发环境 开发工具&#xff1a;Pycharm 2020.1开发语言&#xff1a;Python 3.8.0Web框架&#xff1a;Django 3.0.6数据库&#xff1a;…

【SpringBoot】Redis Lua脚本实战指南:简单高效的构建分布式多命令原子操作、分布式锁

文章目录 一.Lua脚本1.Lua特性2.Lua优势 二.Lua语法1.注释2.变量3.数据类型&#xff1a;3.1.基本类型3.2.对象类型&#xff1a;表&#xff08;table&#xff09; 4.控制结构&#xff1a;4.1.条件语句: 使用if、else和elseif来实现条件分支。4.2.循环结构&#xff1a;Lua支持for…

Vue中进行粘贴板粘贴数据(图片、文字等)

在页面中如果需要进行粘贴数据&#xff0c;那么就要读取系统粘贴板clipboard&#xff0c;通过此Api来进行粘贴板数据的操作。 目录: 一.封装相关函数1.示例代码&#xff1a;2.代码解释&#xff1a; 二.页面中进行粘贴1.代码示例&#xff1a;2.代码解释&#xff1a; 三.运行结果…

使用html和css实现个人简历表单的制作

根据下列要求&#xff0c;做出下图所示的个人简历&#xff08;表单&#xff09; 表单要求 Ⅰ、表格整体的边框为1像素&#xff0c;单元格间距为0&#xff0c;表格中前六列列宽均为100像素&#xff0c;第七列 为200像素&#xff0c;表格整体在页面上居中显示&#xff1b; Ⅱ、前…

Ansible----playbook模块之templates模块、tags模块、roles模块

目录 引言 一、templates模块 &#xff08;一&#xff09;关键信息 &#xff08;二&#xff09;实际操作 1.定义主机组 2.设置免密登录 3.分别建立访问目录 4.定义模板文件 5.创建playbook文件 6.执行剧本 7.验证结果 二、tags模块 &#xff08;一&#xff09;创建…

i春秋-GetFlag

题目 考点 sql注入&#xff0c;md5加密&#xff0c;代码审计&#xff0c;利用eval函数 解题 参考wp https://www.cnblogs.com/qiaowukong/p/13630130.html找md5值 看见验证码中的提示&#xff0c;就是去找一个md5值前六位是指定值的数&#xff08;严格来说不一定是数&…

虚拟化技术 安装和配置StartWind iSCSI目标服务器

一、实验内容 安装StartWind iSCSI目标服务器配置StartWind iSCSI目标服务器 二、实验主要仪器设备及材料 安装有64位Windows操作系统的台式电脑或笔记本电脑&#xff0c;建议4C8G或以上配置已安装vSphere Client已创建虚拟机并在其上安装CentOS6.5StarWind安装介质starwind.…

系统分析师论文——论软件需求分析方法和工具的选用

现已临近2024年软考&#xff0c;周围一些报名参加系统分析师考试的“小伙伴”还未准备论文&#xff0c;我分享早年写的一些内容&#xff08;包括参加继续教育准备的论文&#xff09;&#xff0c;仅供大家结合最新考纲要求酌情参考&#xff0c;希望予人玫瑰&#xff0c;手有余香…

N5183B是德科技n5183b信号源

181/2461/8938产品概述&#xff1a; 简  述&#xff1a; N5183B 频率范围&#xff1a;9 kHz 至 20 GHz&#xff0c;具有 AM、FM、相位调制功能。N5183B MXG X 系列微波模拟信号发生器拥有 9 kHz 至 40 GHz 的频率覆盖范围&#xff0c;以及接近 PSG 级别的相位噪声性能&…