news 2026/5/15 3:25:47

SQLite vs MySQL 超全对比|小项目选谁?一篇讲透!

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SQLite vs 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>

连接代码

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

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

完整工具类

publicclassSQLiteUtils{privatestaticfinalStringURL="jdbc:sqlite:student.db";publicstaticConnectiongetConnection()throwsSQLException{returnDriverManager.getConnection(URL);}// 查询publicstaticResultSetquery(Stringsql){try(Connectionconn=getConnection();Statementstmt=conn.createStatement()){returnstmt.executeQuery(sql);}catch(SQLExceptione){e.printStackTrace();returnnull;}}// 增删改publicstaticintupdate(Stringsql){try(Connectionconn=getConnection();Statementstmt=conn.createStatement()){returnstmt.executeUpdate(sql);}catch(SQLExceptione){e.printStackTrace();return0;}}}

MySQL:配置多一点

Maven 依赖

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

连接代码

// 需要用户名、密码、地址、端口Stringurl="jdbc:mysql://localhost:3306/test?serverTimezone=Asia/Shanghai";Stringuser="root";Stringpassword="123456";Connectionconn=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 示例

CREATETABLEstudent(idINTEGERPRIMARYKEYAUTOINCREMENT,-- 注意是 AUTOINCREMENTnameTEXTNOTNULL,ageINTEGER,scoreREAL-- 浮点数);

MySQL 示例

CREATETABLEstudent(idINTPRIMARYKEYAUTO_INCREMENT,-- 注意是 AUTO_INCREMENTnameVARCHAR(50)NOTNULL,ageINT,scoreDECIMAL(5,2));

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

4.2 插入数据

两者语法完全一样

INSERTINTOstudent(name,age,score)VALUES('张三',20,89.5);

4.3 查询数据

也完全一样:

SELECT*FROMstudentWHEREage>18ORDERBYscoreDESC;

4.4 查看建表语句

SQLite 特有(很有用!):

-- 查看某个表的创建语句SELECTsqlFROMsqlite_masterWHEREtype='table'ANDname='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 没关闭就开了新的,就会锁死。

解决

// ❌ 错误示范:连接没关Connectionconn=getConnection();Statementstmt=conn.createStatement();stmt.executeUpdate("INSERT ...");// 忘记 close!下次再连就报错// ✅ 正确示范:用 try-with-resources 自动关闭try(Connectionconn=getConnection();Statementstmt=conn.createStatement()){stmt.executeUpdate("INSERT ...");}// 自动 close,不会锁库

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

❌ 坑 2:AUTOINCREMENT 不生效

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

  1. 字段类型是INTEGER(不能是INT
  2. 必须是PRIMARY KEY
-- ✅ 正确idINTEGERPRIMARYKEYAUTOINCREMENT-- ❌ 错误idINTPRIMARYKEYAUTOINCREMENT-- INT 不行!

❌ 坑 3:没有 Boolean 类型

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

  • 0= false
  • 1= true

❌ 坑 4:不支持 ALTER TABLE 删列

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

-- 1. 创建新表(不含要删的列)CREATETABLEstudent_new(idINTEGERPRIMARYKEY,nameTEXT);-- 2. 复制数据INSERTINTOstudent_newSELECTid,nameFROMstudent;-- 3. 删旧表DROPTABLEstudent;-- 4. 重命名ALTERTABLEstudent_newRENAMETOstudent;

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

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

更详细的场景对照

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

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

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

// 数据存在内存里,程序结束就消失,速度极快!Connectionconn=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[]

如果本文对你有帮助,请点赞 + 收藏 + 关注!
💬有任何问题欢迎在评论区留言,有问必答!

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/15 3:21:07

构建本地AI语音助手Klatsch:从原理到多设备协同部署

1. 项目概述&#xff1a;Klatsch&#xff0c;一个全天候的本地AI助手代理 如果你和我一样&#xff0c;对智能家居和自动化充满热情&#xff0c;同时又对完全依赖云端服务的语音助手心存疑虑——担心隐私、延迟&#xff0c;或者单纯想在断网时也能让电脑“听话”——那么Klatsc…

作者头像 李华
网站建设 2026/5/15 3:19:10

AudioMuse-AI:基于扩散模型与CLAP的文本生成音乐开源项目实战

1. 项目概述&#xff1a;当AI成为你的专属音乐制作人最近在折腾一个挺有意思的开源项目&#xff0c;叫AudioMuse-AI。简单来说&#xff0c;它就是一个能让你用文字描述来生成音乐的AI工具。你不需要懂乐理&#xff0c;不需要会弹奏任何乐器&#xff0c;甚至不需要知道什么是和弦…

作者头像 李华
网站建设 2026/5/15 3:17:05

Rust集成ChatGPT API:chat-gpt-lib-rs库实战指南

1. 项目概述与核心价值 最近在折腾Rust生态下的AI应用开发&#xff0c;发现一个挺有意思的库&#xff1a; arend-jan/chat-gpt-lib-rs 。这本质上是一个非官方的Rust客户端库&#xff0c;专门用来和OpenAI的ChatGPT API&#xff08;现在更准确地说是Chat Completions API&…

作者头像 李华
网站建设 2026/5/15 3:16:03

功率MOSFET失效分析与检测技术详解

1. 功率MOSFET失效分析的关键价值与挑战功率MOSFET作为现代电力电子系统的"肌肉"&#xff0c;承担着电能转换与功率控制的核心职能。在变频器、电源模块、电机驱动等场景中&#xff0c;一个失效的MOSFET可能导致整个系统瘫痪。我曾参与过某工业变频器的故障调查&…

作者头像 李华
网站建设 2026/5/15 3:14:59

可控RAG智能体:从检索增强生成到模块化状态机的工程实践

1. 项目概述&#xff1a;当RAG遇上“方向盘”&#xff0c;可控智能体的新范式最近在开源社区里&#xff0c;一个名为“Controllable-RAG-Agent”的项目引起了我的注意。它的名字直译过来是“可控的RAG智能体”&#xff0c;这听起来有点意思。我们都知道&#xff0c;RAG&#xf…

作者头像 李华
网站建设 2026/5/15 3:14:09

数据科学协作新范式:构建可复现、可追溯的“小宇宙”项目

1. 项目概述&#xff1a;从“小宇宙”到数据科学协作的范式革新最近在GitHub上闲逛&#xff0c;发现了一个挺有意思的项目——datawhalechina/tiny-universe。乍一看这个名字&#xff0c;“小宇宙”&#xff0c;感觉有点玄乎&#xff0c;但点进去仔细研究后&#xff0c;发现它远…

作者头像 李华