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.xdnf.cn/news/1420173.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

在Qt工具栏上实现矩阵并排的按钮效果源码

如果这个要用MFC去实现头皮都得掉一层&#xff0c;建议大家以后要写GUI方面的小工具尽量转QT或其他吧&#xff0c;MFC真不适合搞这种花里胡哨的界面. 在Qt工具栏上实现矩阵并排的按钮效果源码如下&#xff1a; #include "mainwindow.h" #include "ui_mainwind…

conan2 基础入门(06)-conanfile.py入门

conan2 基础入门(06)-conanfile.py入门 文章目录 conan2 基础入门(06)-conanfile.py入门⭐准备预备文件和Code ⭐使用流程指令 ⭐具体讲解conanfile.pyconan install END视频教学 ⭐准备 注意&#xff0c;如果想跟好的学习conanfile.py建议使用python来安装conan。 当然使用其…

【Ubuntu20.04安装java-8-openjdk】

1 下载 官网下载链接&#xff1a; https://www.oracle.com/java/technologies/downloads/#java8 下载 最后一行 jdk-8u411-linux-x64.tar.gz&#xff0c;并解压&#xff1a; tar -zxvf jdk-8u411-linux-x64.tar.gz2 环境配置 1、打开~/.bashrc文件 sudo gedit ~/.bashrc2、…

LeetCode 题目 119:杨辉三角 II

题目描述 给定一个非负索引 rowIndex&#xff0c;返回杨辉三角的第 rowIndex 行。在这里&#xff0c;rowIndex 从 0 开始。 此题与生成杨辉三角的完整图形略有不同&#xff0c;要求的是能够直接计算出杨辉三角的某一特定行。因此&#xff0c;优化算法的空间复杂度是关键。 方…

Unity开发中导弹路径散射的原理与实现

Unity开发中导弹路径散射的原理与实现 前言逻辑原理代码实现导弹自身脚本外部控制脚本 应用效果结语 前言 前面我们学习了导弹的追踪的效果&#xff0c;但是在动画或游戏中&#xff0c;我们经常可以看到导弹发射后的弹道是不规则的&#xff0c;扭扭曲曲的飞行&#xff0c;然后击…

Linux服务器常用巡检命令,查看日志

查看日志 3.1 通过journalctl命令查看系统日志 命令&#xff1a;journalctl 3.2 通过tail查看系统日志 查看日志文件多少行代码&#xff1a;tail -n [行数] [日志文件] 4. 服务状态 4.1 查看指定服务的状态 命令&#xff1a;systemctl status <service> 比如查看防火墙…

软考-软件工程

软件工程概述 软件工程指的是应用计算机科学、数学及管理科学等原理&#xff0c;以工程化的原则和方法来解决软件 问题的工程&#xff0c;目的是提高软件生产率、提高软件质量、降低软件成本。 概述&#xff1a; 软件开发模型&#xff1a;指导软件开发的体系 需求分析确定软件…

##15 探索高级数据增强技术以提高模型泛化能力

文章目录 前言数据增强的重要性常见的数据增强技术高级数据增强技术在PyTorch中实现数据增强结论 前言 在深度学习领域&#xff0c;数据增强是一种有效的技术&#xff0c;它可以通过在原始数据上应用一系列变换来生成新的训练样本&#xff0c;从而增加数据的多样性&#xff0c…

Remix Client/Server 架构

Remix 框架是服务端渲染架构&#xff0c;当路由请求时生成 HTML 并返回浏览器。这种 SSR 是如何实现的呢&#xff1f;如果不使用 Remix 这种框架&#xff0c;可以在服务器段启动一个无头浏览器进行页面渲染并返回&#xff0c;代价就是要在服务器上启动一个 Chrome 服务&#xf…

萤火虫优化算法(Firefly Algorithm)

注意&#xff1a;本文引用自专业人工智能社区Venus AI 更多AI知识请参考原站 &#xff08;[www.aideeplearning.cn]&#xff09; 算法背景 萤火虫优化算法&#xff0c;是由剑桥大学的Xin-She Yang在2009年提出的一种基于群体智能的优化算法。它的灵感来源于萤火虫在夜晚闪烁…

[算法面试]_01_L1和L2正则化,为什么L1正则化更容易导致稀疏?

本人今年参加了很多面试&#xff0c;也有幸拿到了一些大厂的offer&#xff0c;整理了众多面试资料&#xff0c;后续还会分享众多面试资料。 整理成了面试系列&#xff0c;由于时间有限&#xff0c;每天整理一点&#xff0c;后续会陆续分享出来&#xff0c;感兴趣的朋友可关注收…

OBS插件--复合模糊

复合模糊 复合是一款滤镜插件&#xff0c;支持多种模糊类型和多种蒙版效果。支持模糊源的部分显示区域&#xff0c;可以反选区域进行模糊&#xff0c;这个功能对于场景部分区域需要遮盖非常实用。 下面截图演示下操作步骤&#xff1a; 首先&#xff0c;打开 OBS直播助手 在…

2024年数维杯数学建模

高质量原创论文已完成 需要的私我

MySQL性能优化:MySQL中的隐式转换造成的索引失效

目录 前言数据准备SQL测试分析和总结 前言 数据库优化是一个任重而道远的任务&#xff0c;想要做优化必须深入理解数据库的各种特性。在开发过程中我们经常会遇到一些原因很简单但造成的后果却很严重的疑难杂症&#xff0c;这类问题往往还不容易定位&#xff0c;排查费时费力最…

微服务下的技术栈架构解析

微服务是一种架构风格&#xff0c;它将一个复杂的应用拆分成多个独立自治的服务&#xff0c;每个服务负责应用程序中的一小部分功能。这些服务通过定义良好的API进行通信&#xff0c;通常是HTTP RESTful API或事件流。微服务架构的主要特点包括单一职责、自治性、可独立部署和扩…

力扣例题(用栈实现队列)

目录 链接. - 力扣&#xff08;LeetCode&#xff09; 描述 思路 push pop peek empty 代码 链接. - 力扣&#xff08;LeetCode&#xff09; 描述 思路 push 例如我们将10个元素放入栈中&#xff0c;假设最左边为栈顶&#xff0c;最右侧为栈底 则为10,9,8,7,6,5,4,3,…

PyCharm2024安装教程

PyCharm是一款功能强大的Python集成开发环境&#xff08;IDE&#xff09;&#xff0c;它提供了许多工具和功能来帮助开发者编写、调试和测试Python代码。以下是使用PyCharm的基本步骤&#xff1a; 安装PyCharm&#xff1a;首先&#xff0c;你需要从JetBrains官方网站下载并安装…

关于画图-一次性搞定各类高级论文作图及配色

关于画图-一次性搞定各类高级论文作图及配色 图&#xff08;Figure&#xff09;可以让各类论文的结果更加直观&#xff0c;有时候一张图片比一大段文字更有说服力。 但许多新手作者可能会有一连串的疑惑&#xff1a;数据这么多&#xff0c;什么时候该做什么类型的图&#xff…

事务的基础

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;面经 ⛺️稳中求进&#xff0c;晒太阳 事务的基础 1&#xff09;事务 事务是&#xff1a;一组操作的集合 &#xff0c;他是不可分割的工作单位。事务会把所有操作作为一个整体一起向系统提…

Linux:Figshare网站文件下载(非浏览器)

参考aws亚马逊云下载figshare内容 Linux wget -c 下载网页内容crul -C_figshare怎么下载数据-CSDN博客 尝试一下 mamba search awscli mamba install awscli2.15.48 aws --version通过网页获取下载链接 比如&#xff1a; https://s3-eu-west-1.amazonaws.com/pfigshare-u-…