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 驱动名和数据库 URL
         String 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);
             //插入sql
             String 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,性能不是一个量级

在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

俄罗斯方块的代码实现

文章目录 首先是头文件的引入部分接下来是一些预处理指令接下来定义了两个结构体&#xff1a;接下来是全局变量g_hConsoleOutput&#xff0c;用于存储控制台输出句柄。之后是一系列函数的声明最后是main函数源码 首先是头文件的引入部分 包括stdio.h、string.h、stdlib.h、tim…

Neo4j 之安装和 CQL 基本命令学习

正常使用结构化的查询语言 SQL&#xff08;Structured Query Language&#xff09;较多一些&#xff0c;但是像 Neo4j 这种非结构化的图形数据库来说&#xff0c;就不得不学习下 CQL&#xff08;Cypher Query Language&#xff09;语言了。如果你之前学过 《离散数学》或《图论…

【北京迅为】《iTOP-3588从零搭建ubuntu环境手册》-第6章 安装Samba

RK3588是一款低功耗、高性能的处理器&#xff0c;适用于基于arm的PC和Edge计算设备、个人移动互联网设备等数字多媒体应用&#xff0c;RK3588支持8K视频编解码&#xff0c;内置GPU可以完全兼容OpenGLES 1.1、2.0和3.2。RK3588引入了新一代完全基于硬件的最大4800万像素ISP&…

Debian安装Redis、RabbitMQ、Nacos

安装Redis&#xff1a; 启动Redis、开机自启动 sudo systemctl start redis-server #启动sudo systemctl enable redis-server #开机自启 Redis状态(是否在运行) sudo systemctl status redis-server #查看运行状态 redis-cli ping # 客户端尝试连接 安装RabbitMQ&#xff0c;…

Rust学习笔记(中)

前言 笔记的内容主要参考与《Rust 程序设计语言》&#xff0c;一些也参考了《通过例子学 Rust》和《Rust语言圣经》。 Rust学习笔记分为上中下&#xff0c;其它两个地址在Rust学习笔记&#xff08;上&#xff09;和Rust学习笔记&#xff08;下&#xff09;。 错误处理 pani…

百问C语言第1问——彻底弄懂define用法

系列文章目录 玩转指针专栏 趣味c程序专栏 一.c语言关系操作符练习题(新手必会) 一.c语言常见概念(超全) 一.趣味c程序—关机程序&#xff08;整蛊同学版) 二.趣味c程序—猜数字游戏&#xff08;含干货知识点 三.趣味c程序—打印图形&#xff08;1&#xff09;&#xff08;含干…

前端笔记-day05

文章目录 01-结构伪类选择器02-结构伪类选择器-公式用法03-伪元素选择器04-盒子模型-组成05-盒子模型-边框线06-盒子模型-单方向边框线07-盒子模型-内边距08-盒子模型-padding多值写法09-盒子模型-尺寸计算10-盒子模型-版心居中11-清除默认样式12-元素溢出overflow13-外边距合并…

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

题目&#xff1a; 题解&#xff1a; class Solution {public ListNode deleteDuplicates(ListNode head) {if (head null) {return head;}ListNode cur head;while (cur.next ! null) {if (cur.val cur.next.val) {cur.next cur.next.next;} else {cur cur.next;}}return…

E - Yet Another Sigma Problem(ABC字典树)

思路&#xff1a;我们可以发现两个字符串的最长公共前缀就是字典树中的最近公共祖先。然而这道题&#xff0c;比如说某个结点是x个字符串的前缀&#xff0c;那么当前结点对答案的贡献为x * (x - 1) / 2&#xff0c;就是x中任选两个字符串组合&#xff0c;因为在这之前&#xff…

Linux提权--本地环境变量文件配合 SUID

免责声明:本文仅做技术交流与学习... 目录 背景: 前提条件: 演示: 实战中如何操作? 探针发现: 背景: 环境变量提权--------> 背景&#xff1a; 管理员编译了程序&#xff0c;给予了程序管理员运行的方案, 攻击通过对程序的运行调试反编译等得到了程序的运行大概逻辑, …

软考-软件工程

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

使用Remix部署智能合约到币安链(Remix的操作介绍 币安链合约的部署) 点赞收藏哦

大家好&#xff0c;我是程序员大猩猩呀。 据我所知&#xff0c;很多人进入币圈之后&#xff0c;想要通过炒币一夜暴富&#xff01;另一部分人呢他们希望自己能创建一个项目&#xff0c;然后发行自己的数字货币然后暴富。 不管是什么方式吧&#xff0c;只要不违法&#xff0c;…

原创未发表!24年新算法SBOA优化TVFEMD实现分解+四种熵值+频谱图+参数变化图+相关系数图!

声明&#xff1a;文章是从本人公众号中复制而来&#xff0c;因此&#xff0c;想最新最快了解各类智能优化算法及其改进的朋友&#xff0c;可关注我的公众号&#xff1a;强盛机器学习&#xff0c;不定期会有很多免费代码分享~ 目录 数据介绍 优化流程 创新点 使用TVFEMD的创…

【详细介绍下Visual Studio】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

树莓派、ubuntu低版本python3安装库

如果遇到树莓派中自带低版本python3&#xff0c;又不想额外去安装python3时&#xff0c;可能会遇到版本过低&#xff0c;无法安装库的情况&#xff0c;以下用我实际情况举例解决方案。 本次遇到的问题是树莓派低版本中&#xff0c;python3为3.7.3&#xff0c;需要安装numpy&am…

数据结构与算法学习笔记三---循环队列的表示和实现(C语言)

目录 前言 1.为啥要使用循环队列 2.队列的顺序表示和实现 1.定义 2.初始化 3.销毁 4.清空 5.空队列 6.队列长度 7.获取队头 8.入队 9.出队 10.遍历队列 11.完整代码 前言 本篇博客介绍栈和队列的表示和实现。 1.为啥要使用循环队列 上篇文章中我们知道了顺序队列…

【数据结构】静态链表

静态链表 1.静态链表的结构设计&#xff1a; typedef struct SNode {int data; // 数据int next; //后继指针&#xff08;下标&#xff09; }SNode, SLinkList[MAXSIZE];2.静态链表的结构示意图 0&#xff1a;有效数据链的头结点 1&#xff1a;空闲数据链的头结点 3.静态链表…

重生奇迹mu再生宝石怎么用有什么用

重生奇迹mu再生宝石有2个用处&#xff1a; 1、在玛雅哥布林处给380装备加PVP属性4追4以上的380级装备,守护宝石一颗,再生宝石一颗,成功得到PVP装备,失败宝石消失,装备无变化&#xff1b; 2、给非套装点强化属性用法跟祝福,灵魂,生命一样直接往装备上敲,成功得到随机强化属性一…

【linux软件基础知识】如何使用 run_list 字段将任务放入就绪队列中

在给定的代码片段中,struct task_struct 表示内核中任务或进程的进程控制块 (PCB)。 run_list 字段的类型为 struct list_head,这表明它是链表实现的一部分。 run_list字段在Linux内核中常用来表示任务在调度队列中的位置,例如就绪队列或各种优先级队列。 init_task是一个…

深入理解Java并发:Future与CompletableFuture详解

知识背景&#xff1a; 在工作过程中有用到CompletableFuture&#xff0c;之前接触不多&#xff0c;特此下来学习一下&#xff0c;与大家一起分享&#xff01; 总体介绍&#xff1a; 在多线程编程中&#xff0c;异步计算是一种常见的需求。其中Future和CompletableFuture是处…