Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > SQLite与MySQL对比

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

作者:WL_Aurora

SQLite和MySQL是两种流行的数据库管理系统,它们各有特点,适用于不同的场景,这篇文章主要介绍了SQLite与MySQL超全对比的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下

一句话总结

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

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

故事开场:小王的困境

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

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

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

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

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

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

MySQL 是典型的 C/S 架构

特点

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

SQLite 是 Serverless 架构

特点

🔥 关键区别: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)
日期TEXTINTEGERDATE / 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 代替:

坑 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:");

适用场景

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

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

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

你可以:

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

总结

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

一句话

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

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

附录

SQLite 字段类型速查

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

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

您可能感兴趣的文章:
阅读全文