1. 引言
1.1 SQLite简介
SQLite 是一个嵌入式关系型数据库管理系统,它不需要单独的服务器进程或系统配置。它的设计目标是简单、高效、可靠,适用于各种应用场景,尤其是移动设备和嵌入式系统。
1.2 为什么选择SQLite
- 轻量级:文件大小通常在几百KB到几MB之间。
- 无服务器架构:不需要单独的服务器进程。
- 跨平台支持:支持多种操作系统和编程语言。
- 事务支持:支持ACID事务。
1.3 适用场景与限制
- 适用场景:移动应用、桌面应用、嵌入式系统、临时数据存储。
- 限制:不适合高并发写操作,不适合处理非常大的数据集。
2. 安装与配置
2.1 安装SQLite
可以通过包管理器安装SQLite:
# Ubuntu/Debian
sudo apt-get install sqlite3# macOS (Homebrew)
brew install sqlite3# Windows
# 下载预编译二进制文件并解压
2.2 配置环境变量
确保 sqlite3
命令可以在命令行中使用。
2.3 使用SQLite命令行工具
启动SQLite命令行工具:
sqlite3 mydatabase.db
3. 基础概念
3.1 数据库与表
数据库是一个容器,可以包含多个表。表由行(记录)和列(字段)组成。
3.2 SQL语言基础
SQL(Structured Query Language)用于管理和操作关系型数据库。常见的SQL语句包括 SELECT
, INSERT
, UPDATE
, DELETE
等。
3.3 数据类型
SQLite 支持以下数据类型:
NULL
INTEGER
REAL
TEXT
BLOB
3.4 索引与约束
索引可以加速查询,约束用于保证数据完整性(如主键、唯一性、外键等)。
4. 创建与管理数据库
4.1 创建数据库文件
-- 创建一个新的数据库文件
sqlite3 mydatabase.db
4.2 创建表
CREATE TABLE users (id INTEGER PRIMARY KEY,name TEXT NOT NULL,email TEXT UNIQUE,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
4.3 插入、更新和删除数据
-- 插入数据
INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');-- 更新数据
UPDATE users SET email = 'alice_new@example.com' WHERE id = 1;-- 删除数据
DELETE FROM users WHERE id = 1;
4.4 备份与恢复数据库
# 备份数据库
sqlite3 mydatabase.db .dump > backup.sql# 恢复数据库
sqlite3 mydatabase.db < backup.sql
5. 查询优化
5.1 查询语句优化
使用索引可以显著提高查询性能:
CREATE INDEX idx_users_email ON users (email);-- 使用索引进行查询
SELECT * FROM users WHERE email = 'alice@example.com';
5.2 使用索引提高性能
创建索引时要考虑查询频率和插入/更新操作的开销。
5.3 分析查询计划
EXPLAIN QUERY PLAN SELECT * FROM users WHERE email = 'alice@example.com';
5.4 常见性能瓶颈及解决方案
- 瓶颈:频繁的写操作导致锁争用。
- 解决方案:批量插入数据,减少事务次数。
6. 事务与并发控制
6.1 事务的基本概念
事务是一组SQL语句,要么全部执行成功,要么全部回滚。
6.2 开始、提交与回滚事务
BEGIN TRANSACTION;-- 执行多个SQL语句
INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');
INSERT INTO users (name, email) VALUES ('Charlie', 'charlie@example.com');COMMIT;
-- 或者
-- ROLLBACK;
6.3 并发控制机制
SQLite 使用锁机制来控制并发访问。以下是一个使用Python多线程演示并发控制的示例。
使用Python多线程演示并发控制
import sqlite3
import threading
import time# 连接到数据库
def connect_db():return sqlite3.connect('mydatabase.db')# 插入数据的函数
def insert_data(thread_id):conn = connect_db()cursor = conn.cursor()