一篇讲透SQLite与MySQL超全对比(小项目选谁?)

 更新时间:2026年07月22日 08:29:49   作者:WL_Aurora  
SQLite和MySQL是两种流行的数据库管理系统,它们各有特点,适用于不同的场景,这篇文章主要介绍了SQLite与MySQL超全对比的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

一句话总结

场景推荐选择
桌面软件、单机应用、小程序、嵌入式设备SQLite ✅
网站后台、高并发、多人协作、大数据量MySQL ✅

💡 本文不讲深奥原理,只讲怎么选、怎么用、怎么避坑。

故事开场:小王的困境

小王用 JavaFX 做一个桌面记账软件,需要存用户的账单数据。

他一开始想装 MySQL,结果发现:

  • 😱 MySQL 8.0 安装包 400MB+,安装完占 700MB 内存
  • 😱 用户电脑没装 MySQL,软件根本跑不了
  • 😱 换个电脑还要重新配数据库

后来他发现了 SQLite —— 一个只有一个文件的数据库,直接塞进项目里,随软件一起打包!

🎉 这就是 SQLite 的魅力:零配置、零安装、随用随走。

一、架构对比:一个"没服务器",一个"有服务器"

MySQL:经典的客户端-服务器模式

MySQL 是典型的 C/S 架构:

  • 有一个独立的 mysqld 进程 在后台运行
  • 你的程序通过 JDBC/网络 连接到服务器
  • 服务器再读写磁盘上的数据文件

特点:

  • ✅ 支持多客户端同时连接(网站多人访问)
  • ✅ 有完善的权限管理、事务、备份机制
  • ❌ 需要单独安装、配置、维护

SQLite:无服务器的嵌入式模式

SQLite 是 Serverless 架构:

  • 没有独立的服务器进程
  • 数据库就是一个 .db 文件
  • 你的程序直接通过库文件读写数据

特点:

  • ✅ 零配置、零安装,一个文件搞定
  • ✅ 启动速度极快(毫秒级)
  • ✅ 可以随应用一起打包分发
  • ❌ 单线程写入(多个程序同时写会锁死)

🔥 关键区别:MySQL 是"饭店"(有服务员、有厨房),SQLite 是"自热火锅"(打开就能吃)。

二、核心指标对比表

对比维度SQLiteMySQL
体积约 1MB(一个库文件)安装包 400MB+,运行占 500MB+ 内存
安装不需要安装需要安装、配置、启动服务
部署直接复制 .db 文件需要导出 SQL、导入、配权限
并发单写多读(写会锁库)多线程读写,支持高并发
网络访问❌ 不支持(本地文件)✅ 支持远程连接
数据量适合 GB 级别适合 TB 级别
用户权限❌ 无(靠文件系统权限)✅ 精细的 GRANT 权限控制
事务✅ ACID 完整支持✅ ACID + 更复杂的隔离级别
存储引擎只有一种InnoDB、MyISAM 等多种可选
适用场景桌面App、嵌入式、测试、缓存网站、企业系统、大数据

三、Java 代码对比:连接方式差在哪?

SQLite:简单到离谱

Maven 依赖:

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

连接代码:

// 不需要用户名密码!不需要启动服务!
// 直接指定一个本地文件,不存在会自动创建
Connection conn = DriverManager.getConnection("jdbc:sqlite:mydata.db");

🎉 就这一行!没有 Class.forName() 也行(JDBC 4.0+ 自动加载)。

完整工具类:

public class SQLiteUtils {
    private static final String URL = "jdbc:sqlite:student.db";

    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(URL);
    }

    // 查询
    public static ResultSet query(String sql) {
        try (Connection conn = getConnection();
             Statement stmt = conn.createStatement()) {
            return stmt.executeQuery(sql);
        } catch (SQLException e) {
            e.printStackTrace();
            return null;
        }
    }

    // 增删改
    public static int update(String sql) {
        try (Connection conn = getConnection();
             Statement stmt = conn.createStatement()) {
            return stmt.executeUpdate(sql);
        } catch (SQLException e) {
            e.printStackTrace();
            return 0;
        }
    }
}

MySQL:配置多一点

Maven 依赖:

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

连接代码:

// 需要用户名、密码、地址、端口
String url = "jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai";
String user = "root";
String password = "123456";
Connection conn = DriverManager.getConnection(url, user, password);

⚠️ 还要确保 MySQL 服务已启动,否则直接报错 Communications link failure。

四、SQL 语法对比:几乎一样,但有坑!

4.1 创建表

SQLiteMySQL
自增主键INTEGER PRIMARY KEY AUTOINCREMENTINT PRIMARY KEY AUTO_INCREMENT
字符串TEXTVARCHAR(255)
日期TEXT 或 INTEGERDATE / DATETIME

SQLite 示例:

CREATE TABLE student (
    id INTEGER PRIMARY KEY AUTOINCREMENT,  -- 注意是 AUTOINCREMENT
    name TEXT NOT NULL,
    age INTEGER,
    score REAL  -- 浮点数
);

MySQL 示例:

CREATE TABLE student (
    id INT PRIMARY KEY AUTO_INCREMENT,     -- 注意是 AUTO_INCREMENT
    name VARCHAR(50) NOT NULL,
    age INT,
    score DECIMAL(5,2)
);

⚠️ 坑 1:SQLite 的自增只能用在 INTEGER PRIMARY KEY,不能是 INT!

4.2 插入数据

两者语法完全一样:

INSERT INTO student (name, age, score) 
VALUES ('张三', 20, 89.5);

4.3 查询数据

也完全一样:

SELECT * FROM student WHERE age > 18 ORDER BY score DESC;

4.4 查看建表语句

SQLite 特有(很有用!):

-- 查看某个表的创建语句
SELECT sql FROM sqlite_master 
WHERE type = 'table' AND name = 'student';

MySQL 用 SHOW CREATE TABLE student;

五、在 IDEA 中使用 SQLite

5.1 添加依赖后,打开 Database 面板

View → Tool Windows → Database

5.2 添加 SQLite 数据源

+ → Data Source → SQLite

5.3 选择数据库文件

点击 File 旁边的浏览按钮,选择你的 .db 文件:

5.4 测试连接

点击 Test Connection,看到绿色对勾就成功了!

💡 不需要用户名密码,因为 SQLite 没有用户系统,权限靠操作系统的文件权限控制。

六、SQLite 常见踩坑指南

坑 1:database is locked(数据库被锁)

报错:SQLITE_BUSY: database is locked

原因:SQLite 单线程写入。如果你在代码里开了两个 Connection 同时写,或者上一个 Connection 没关闭就开了新的,就会锁死。

解决:

// ❌ 错误示范:连接没关
Connection conn = getConnection();
Statement stmt = conn.createStatement();
stmt.executeUpdate("INSERT ...");
// 忘记 close!下次再连就报错

// ✅ 正确示范:用 try-with-resources 自动关闭
try (Connection conn = getConnection();
     Statement stmt = conn.createStatement()) {
    stmt.executeUpdate("INSERT ...");
} // 自动 close,不会锁库

🔥 这是 SQLite 最重要的坑! 记住:用一次,关一次。

坑 2:AUTOINCREMENT 不生效

原因:SQLite 的自增必须满足:

  1. 字段类型是 INTEGER(不能是 INT)
  2. 必须是 PRIMARY KEY
-- ✅ 正确
id INTEGER PRIMARY KEY AUTOINCREMENT

-- ❌ 错误
id INT PRIMARY KEY AUTOINCREMENT  -- INT 不行!

坑 3:没有 Boolean 类型

SQLite 没有专门的 BOOLEAN,用 INTEGER 代替:

  • 0 = false
  • 1 = true

坑 4:不支持 ALTER TABLE 删列

SQLite 不支持直接删除列, workaround:

-- 1. 创建新表(不含要删的列)
CREATE TABLE student_new (id INTEGER PRIMARY KEY, name TEXT);

-- 2. 复制数据
INSERT INTO student_new SELECT id, name FROM student;

-- 3. 删旧表
DROP TABLE student;

-- 4. 重命名
ALTER TABLE student_new RENAME TO student;

七、到底怎么选?一张图搞定

┌─────────────────────────────────────────────────────────────┐
│                    你的项目是什么类型?                        │
└─────────────────────────────────────────────────────────────┘
                              │
              ┌───────────────┴───────────────┐
              ▼                               ▼
        【单机/桌面应用】                 【网站/服务器】
              │                               │
              ▼                               ▼
        ┌───────────┐                   ┌───────────┐
        │  SQLite   │                   │  MySQL    │
        │  ✅ 推荐   │                   │  ✅ 推荐   │
        └───────────┘                   └───────────┘
        例子:                              例子:
        • 桌面记账软件                        • 电商网站
        • 手机 App 本地缓存                   • 后台管理系统
        • 嵌入式设备                          • 数据分析平台
        • 个人笔记工具                        • 高并发 API 服务

更详细的场景对照

场景推荐理由
做一个给女朋友用的记账小软件SQLite她电脑不用装任何东西
毕业设计(单机版)SQLite答辩时直接拷走就能跑
单元测试用数据库SQLite内存数据库 :memory:,测完即丢
浏览器本地存储(IndexedDB 不够用时)SQLite通过 WASM 运行在浏览器
公司官网 + 后台管理MySQL多人访问、需要权限控制
秒杀系统MySQL + Redis高并发 SQLite 扛不住
数据量 > 1GBMySQLSQLite 大文件性能下降

八、SQLite 进阶:内存模式(测试神器)

SQLite 有个超酷的功能 —— 内存数据库:

// 数据存在内存里,程序结束就消失,速度极快!
Connection conn = DriverManager.getConnection("jdbc:sqlite::memory:");

适用场景:

  • 单元测试(每个测试用例一个独立内存库,互不干扰)
  • 临时数据处理(比 HashMap 方便,有 SQL 语法)
  • 数据缓存(重启程序自动清空)

九、SQLite 数据库文件长什么样?

SQLite 数据库就是一个普通的文件:

myapp/
├── src/
├── lib/
└── data/
    └── app.db   ← 这就是整个数据库!就一个文件

你可以:

  • 用 U 盘拷走 ✅
  • 用微信发给同事 ✅
  • 用 Git 版本控制(但不推荐,二进制文件冲突难处理)

💡 备份就是复制文件,简单粗暴!

总结

你关心什么选 SQLite选 MySQL
简单省事✅❌
零配置部署✅❌
高并发❌✅
大数据量❌✅
远程访问❌✅
用户权限❌✅
随软件打包✅❌

一句话:

🪶 SQLite 是"瑞士军刀" —— 小巧、方便、随时能用,适合个人和小型项目。
🐬 MySQL 是"重型卡车" —— 强大、稳定、能拉货,适合企业和高并发场景。

两者不是竞争关系,而是互补关系。很多项目同时用:MySQL 存核心数据,SQLite 做本地缓存或离线功能。

附录

SQLite 字段类型速查

类型说明对应 Java 类型
NULL空值null
INTEGER整型Long / Integer
REAL浮点Double / Float
TEXT文本String
BLOB二进制byte[]

到此这篇关于SQLite与MySQL超全对比的文章就介绍到这了,更多相关SQLite与MySQL对比内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • MySQL Join关联查询的几种实现方式优化小结

    MySQL Join关联查询的几种实现方式优化小结

    在MySQL日常开发中,JOIN关联查询是高频操作,但相同的业务需求,不同的关联方式可能导致数倍的性能差异,下面就来详细的介绍一下MySQL Join关联查询的几种实现方式,感兴趣的可以了解一下
    2026-04-04
  • 项目容器启动时MySQL端口检测的问题解决

    项目容器启动时MySQL端口检测的问题解决

    本文主要介绍了项目容器启动时MySQL端口检测的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-12-12
  • MySQL创建和删除数据库的命令及相关PHP脚本的操作方法

    MySQL创建和删除数据库的命令及相关PHP脚本的操作方法

    这篇文章主要介绍了MySQL创建和删除数据库的命令及相关PHP脚本的操作方法,这里主要讲述Linux中在mysqladmin下的命令操作,需要的朋友可以参考下
    2015-11-11
  • MySQL最常问的十道面试题(2023年最新详解版)

    MySQL最常问的十道面试题(2023年最新详解版)

    MySQL是一个关系型数据库管理系统,这是学习Java必学的知识点,也是面试java岗位必考的题目,所以大家要有所重视,这篇文章主要给大家介绍了关于MySQL最常问的十道面试题,是2023年最新详细整理的,需要的朋友可以参考下
    2023-10-10
  • MySQL Buffer Pool如何提高页的访问速度

    MySQL Buffer Pool如何提高页的访问速度

    本文主要介绍了MySQL Buffer Pool如何提高页的访问速度,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • MySql索引使用策略分析

    MySql索引使用策略分析

    这篇文章主要介绍了MySql索引使用策略分析,帮助大家更好的理解和使用MySQL,感兴趣的朋友可以了解下
    2020-11-11
  • MySQL union 语法代码示例分析

    MySQL union 语法代码示例分析

    主要介绍的是MySQLunion 语法代码演示,我前两天在相关网站看见MySQLunion 语法代码演示的资料,觉得挺好,就拿出来供大家分享。希望在你今后的学习中会对你有所帮助。
    2010-06-06
  • Linux下如何通过MySQL二进制包安装MySQL5.7

    Linux下如何通过MySQL二进制包安装MySQL5.7

    这篇文章主要介绍了Linux下如何通过MySQL二进制包安装MySQL5.7,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-07-07
  • MySQL Error 1449错误的解决方法

    MySQL Error 1449错误的解决方法

    MySQL Error 1449 错误信息为 “The user specified as a definer ('user'@'host') does not exist”,意思是定义者在当前系统中不存在,从而导致无法正常使用这些对象,本文针对该错误介绍了详细解决方法,需要的朋友可以参考下
    2025-02-02
  • MySQL中Binary Log二进制日志文件的基本操作命令小结

    MySQL中Binary Log二进制日志文件的基本操作命令小结

    这篇文章主要介绍了MySQL中Binary Log二进制日志文件的基本操作小结,包括利用二进制日志恢复数据的方法,需要的朋友可以参考下
    2015-12-12

最新评论