一篇讲透SQLite与MySQL超全对比(小项目选谁?)
作者:WL_Aurora
一句话总结
| 场景 | 推荐选择 |
|---|---|
| 桌面软件、单机应用、小程序、嵌入式设备 | SQLite ✅ |
| 网站后台、高并发、多人协作、大数据量 | MySQL ✅ |
💡 本文不讲深奥原理,只讲怎么选、怎么用、怎么避坑。
故事开场:小王的困境
小王用 JavaFX 做一个桌面记账软件,需要存用户的账单数据。
他一开始想装 MySQL,结果发现:
- 😱 MySQL 8.0 安装包 400MB+,安装完占 700MB 内存
- 😱 用户电脑没装 MySQL,软件根本跑不了
- 😱 换个电脑还要重新配数据库
后来他发现了 SQLite —— 一个只有一个文件的数据库,直接塞进项目里,随软件一起打包!
🎉 这就是 SQLite 的魅力:零配置、零安装、随用随走。
一、架构对比:一个"没服务器",一个"有服务器"
MySQL:经典的客户端-服务器模式

MySQL 是典型的 C/S 架构:
- 有一个独立的 mysqld 进程 在后台运行
- 你的程序通过 JDBC/网络 连接到服务器
- 服务器再读写磁盘上的数据文件
特点:
- ✅ 支持多客户端同时连接(网站多人访问)
- ✅ 有完善的权限管理、事务、备份机制
- ❌ 需要单独安装、配置、维护
SQLite:无服务器的嵌入式模式
SQLite 是 Serverless 架构:
- 没有独立的服务器进程
- 数据库就是一个
.db文件 - 你的程序直接通过库文件读写数据
特点:
- ✅ 零配置、零安装,一个文件搞定
- ✅ 启动速度极快(毫秒级)
- ✅ 可以随应用一起打包分发
- ❌ 单线程写入(多个程序同时写会锁死)
🔥 关键区别:MySQL 是"饭店"(有服务员、有厨房),SQLite 是"自热火锅"(打开就能吃)。
二、核心指标对比表
| 对比维度 | SQLite | MySQL |
|---|---|---|
| 体积 | 约 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 创建表
| SQLite | MySQL | |
|---|---|---|
| 自增主键 | INTEGER PRIMARY KEY AUTOINCREMENT | INT PRIMARY KEY AUTO_INCREMENT |
| 字符串 | TEXT | VARCHAR(255) |
| 日期 | TEXT 或 INTEGER | DATE / 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 的自增必须满足:
- 字段类型是
INTEGER(不能是INT) - 必须是
PRIMARY KEY
-- ✅ 正确 id INTEGER PRIMARY KEY AUTOINCREMENT -- ❌ 错误 id INT PRIMARY KEY AUTOINCREMENT -- INT 不行!
坑 3:没有 Boolean 类型
SQLite 没有专门的 BOOLEAN,用 INTEGER 代替:
0= false1= 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 扛不住 |
| 数据量 > 1GB | MySQL | SQLite 大文件性能下降 |
八、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对比内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
