
SQLite là một hệ quản trị cơ sở dữ liệu quan hệ (RDBMS) nhẹ, không cần máy chủ riêng biệt, được nhúng trực tiếp vào ứng dụng. Khác với MySQL hay PostgreSQL chạy mô hình client-server, SQLite lưu toàn bộ cơ sở dữ liệu — định nghĩa bảng, chỉ mục, dữ liệu — trong một tệp tin đơn lẻ đa nền tảng. Điều này khiến nó trở thành lựa chọn số một cho trình duyệt web, hệ điều hành di động và các hệ thống nhúng nơi đơn giản và đáng tin cậy là ưu tiên hàng đầu.
Kiến trúc không máy chủ và cơ chế khóa tập tin
Vì không có tiến trình máy chủ trung tâm, SQLite dựa vào khóa cấp hệ thống tập tin để điều phối truy cập đồng thời. Khi ghi dữ liệu, nó khóa toàn bộ tệp cơ sở dữ liệu, do đó các lần ghi phải thực hiện tuần tự. Việc đọc vẫn có thể song song, nhưng mô hình này giới hạn thông lượng ghi trong các ứng dụng ghi dày đặc.

Hình trên minh họa kiến trúc lớp của SQLite: trình biên dịch SQL dịch câu truy vấn thành bytecode cho máy ảo, máy ảo điều khiển B-Tree lưu trữ bảng và chỉ mục, trang nhớ (Pager) đọc/ghi khối dữ liệu qua giao diện hệ điều hành.
Chế độ Write-Ahead Logging (WAL) — bước đột phá đồng thời
Kể từ phiên bản 3.7.0 (2010), SQLite hỗ trợ Write-Ahead Logging (WAL). Thay vì ghi trực tiếp vào tệp cơ sở dữ liệu và khóa toàn bộ tệp, WAL ghi các thay đổi vào một tệp nhật ký riêng biệt (-wal) cùng với tệp điểm kiểm tra (-shm) dùng cho bộ nhớ chia sẻ. Kết quả: người đọc không chặn người ghi, người ghi không chặn người đọc — đọc và ghi có thể tiến hành đồng thời thực sự.
Lợi ích chính của WAL
- Đồng thời cao hơn: Nhiều luồng đọc và một luồng ghi cùng hoạt động mà không chặn lẫn nhau.
- Ít I/O đĩa hơn: Chỉ ghi nối tiếp vào tệp WAL, giảm tìm kiếm ngẫu nhiên.
- Khôi phục nhanh: Sau sự cố, SQLite chỉ cần chạy lại (roll forward) các bản ghi trong WAL.
- Tương thích ngược: Cơ sở dữ liệu WAL vẫn đọc được bởi phiên bản cũ (chỉ đọc), và có thể tắt WAL bằng
PRAGMA journal_mode=DELETE.
Toàn vẹn dữ liệu và khôi phục
SQLite đảm bảo tính toàn vẹn giao dịch nhờ cơ chế PRAGMA synchronous. Ở chế độ FULL (mặc định trong WAL), dữ liệu được đồng bộ xuống đĩa sau mỗi giao dịch, an toàn nhất trước sự cố mất điện nhưng chậm hơn. Ở chế độ NORMAL, hiệu năng cao hơn nhưng chấp nhận khả năng mất giao dịch chưa ghi khi sập máy — lựa chọn hợp lý cho ứng dụng di động. Ngoài ra, câu lệnh PRAGMA integrity_check giúp kiểm tra tính toàn vẹn của toàn bộ tệp cơ sở dữ liệu.
Tối ưu hiệu năng cơ bản
- Chỉ mục đúng chỗ: Thêm chỉ mục cho các cột thường xuyên lọc hoặc sắp xếp, chẳng hạn cột khóa ngoại và cột trong mệnh đề
WHERE. - Transaction gộp lô: Bọc nhiều lệnh ghi trong một
BEGIN/COMMITđể giảm số lần ghi đĩa. - WAL checkpoint: Định kỳ chạy
PRAGMA wal_checkpoint(TRUNCATE)để gộp nội dung WAL vào tệp chính và giảm dung lượng. - Phân tích truy vấn: Dùng
EXPLAIN QUERY PLANđể phát hiện truy vấn quét toàn bảng không cần thiết.
Khi nào nên bật WAL
Bật WAL bằng câu lệnh:
PRAGMA journal_mode=WAL;
Phù hợp cho: ứng dụng đọc nhiều ghi ít, ứng dụng đa luồng, cơ sở dữ liệu cục bộ trên mobile/desktop. Tránh WAL khi: hệ thống tập tin không hỗ trợ khóa byte-range tin cậy (một số network FS cũ), hoặc cần tối ưu dung lượng đĩa tối thiểu (WAL tạo tệp phụ).

Ảnh chụp màn hình sqlite3 shell xác nhận chế độ WAL đã được kích hoạt thành công.
So sánh nhanh: SQLite vs. cơ sở dữ liệu client-server
| Đặc điểm | SQLite | MySQL / PostgreSQL |
|---|---|---|
| Kiến trúc | Nhúng, không máy chủ | Client-server |
| Cấu hình | Không cần (zero-config) | Cài đặt, cấu hình, bảo trì |
| Đồng thời ghi | Một luồng (WAL: đọc/ghi song song) | Đa luồng hoàn chỉnh |
| Kích thước | < 1 MB thư viện | Đến hàng trăm MB |
| Phù hợp | App nhúng, mobile, desktop, web nhỏ | Ứng dụng doanh nghiệp, web quy mô lớn |
Ứng dụng thực tế phổ biến
- Trình duyệt: Chrome, Firefox, Safari lưu lịch sử, cookie, IndexedDB backend.
- Di động: Android (Contacts, SMS), iOS (Core Data, HealthKit).
- Desktop: Skype, Dropbox, Adobe Lightroom, 1Password.
- IoT & nhúng: Bộ định tuyến, thiết bị y tế, hệ thống thông tin giải trí ô tô.
Hạn chế cần biết
- Không phù hợp cho ghi đồng thời nặng (hàng nghìn ghi/giây) — hãy dùng PostgreSQL.
- Không hỗ trợ quyền người dùng chi tiết (GRANT/REVOKE) — bảo mật ở cấp ứng dụng.
- Kích thước tệp tối đa 281 TB (đủ cho hầu hết trường hợp).
- Không có kiểu dữ liệu DATE/TIME gốc — lưu dưới dạng TEXT/REAL/INTEGER.
Kết luận
SQLite minh chứng cho triết lý “đơn giản là đỉnh cao của sự tinh vi”. Với chế độ WAL, nó vượt ra khỏi định kiến “chỉ dùng cho ứng dụng nhỏ” và trở thành lựa chọn hợp lý cho nhiều ứng dụng sản xuất cần độ tin cậy cao, triển khai không đau đầu. Nếu bạn xây dựng ứng dụng di động, desktop, hoặc dịch vụ web quy mô vừa — hãy cân nhắc SQLite trước khi lập trình máy chủ cơ sở dữ liệu phức tạp.
Nguồn: Tài liệu chính thức SQLite, Wikipedia, Write-Ahead Logging in SQLite
