SQLite - Lệnh PRAGMA: Hướng dẫn chi tiết cho người mới bắt đầu

Xin chào các bạn đam mê cơ sở dữ liệu! Hôm nay, chúng ta sẽ bắt đầu một hành trình thú vị vào thế giới của các lệnh PRAGMA trong SQLite. Đừng lo lắng nếu bạn chưa từng nghe đến PRAGMA trước đây - đến cuối bài hướng dẫn này, bạn sẽ sử dụng chúng như một chuyên gia!

SQLite - PRAGMA

PRAGMA là gì?

Trước khi chúng ta đi sâu vào, hãy bắt đầu từ những điều cơ bản. Trong SQLite, một PRAGMA là một lệnh đặc biệt cho phép chúng ta thay đổi hành vi của thư viện SQLite hoặc truy vấn trạng thái nội bộ của nó. Hãy nghĩ về PRAGMA như một bảng điều khiển cho cơ sở dữ liệu SQLite của bạn - chúng cho phép bạn tinh chỉnh các thiết lập và nhận thông tin về cách cơ sở dữ liệu của bạn đang hoạt động.

Bây giờ, hãy cùng khám phá một số PRAGMA thường được sử dụng trong SQLite.

PRAGMA auto_vacuum

PRAGMA auto_vacuum giống như việc có một người bạn cùng phòng gọn gàng cho cơ sở dữ liệu của bạn. Nó tự động dọn dẹp và sắp xếp tệp cơ sở dữ liệu khi bạn xóa dữ liệu.

PRAGMA auto_vacuum = FULL;

Lệnh này đặt chế độ auto_vacuum thành FULL, có nghĩa là SQLite sẽ làm việc chăm chỉ để giữ cho tệp cơ sở dữ liệu của bạn nhỏ nhất có thể.

PRAGMA cache_size

PRAGMA cache_size giống như việc cho cơ sở dữ liệu của bạn một bộ não lớn hơn. Nó xác định số lượng trang mà SQLite giữ trong bộ nhớ để truy cập nhanh hơn.

PRAGMA cache_size = 10000;

Điều này đặt kích thước bộ nhớ cache thành 10.000 trang. Bộ nhớ cache nhiều hơn có nghĩa là hiệu suất nhanh hơn, nhưng nó cũng sử dụng nhiều bộ nhớ hơn.

PRAGMA case_sensitive_like

PRAGMA này xác định LIKE operator có phân biệt chữ cái hay không. Nó giống như việc dạy cơ sở dữ liệu của bạn đọc có hoặc không có kính.

PRAGMA case_sensitive_like = TRUE;

Với thiết lập này, 'Apple' LIKE 'app%' sẽ là false, trong khi 'Apple' LIKE 'App%' sẽ là true.

PRAGMA count_changes

PRAGMA count_changes giống như một người ghi điểm cho các thao tác cơ sở dữ liệu của bạn. Nó cho bạn biết có bao nhiêu hàng đã bị thay đổi bởi một lệnh INSERT, UPDATE hoặc DELETE.

PRAGMA count_changes = ON;

Sau khi đặt điều này, khi bạn chạy một lệnh UPDATE, ví dụ, SQLite sẽ cho bạn biết có bao nhiêu hàng đã bị ảnh hưởng.

PRAGMA database_list

PRAGMA này giống như một danh bạ cho cơ sở dữ liệu của bạn. Nó liệt kê tất cả các cơ sở dữ liệu đã gắn kết, bao gồm cả cơ sở dữ liệu chính và bất kỳ cơ sở dữ liệu nào khác bạn đã kết nối.

PRAGMA database_list;

Điều này sẽ hiển thị danh sách tất cả các cơ sở dữ liệu đã gắn kết, đường dẫn tệp của chúng và tên nội bộ của chúng.

PRAGMA encoding

PRAGMA encoding đặt hoặc truy vấn mã hóa văn bản được sử dụng bởi cơ sở dữ liệu. Nó giống như việc chọn ngôn ngữ mà cơ sở dữ liệu của bạn sử dụng.

PRAGMA encoding = "UTF-8";

Điều này đặt mã hóa của cơ sở dữ liệu thành UTF-8, đây là một lựa chọn phổ biến để hỗ trợ nhiều ngôn ngữ.

PRAGMA freelist_count

PRAGMA này cho bạn biết có bao nhiêu trang trống trong tệp cơ sở dữ liệu. Nó giống như việc kiểm tra bạn có bao nhiêu không gian trống trong đơn vị lưu trữ của bạn.

PRAGMA freelist_count;

Điều này sẽ trả về số lượng trang trống trong tệp cơ sở dữ liệu.

PRAGMA index_info và PRAGMA index_list

Những PRAGMA này giống như việc có một thư viện cho các chỉ mục cơ sở dữ liệu của bạn. Chúng cung cấp thông tin về cấu trúc và nội dung của các chỉ mục của bạn.

PRAGMA index_list(table_name);
PRAGMA index_info(index_name);

Lệnh đầu tiên liệt kê tất cả các chỉ mục trên một bảng, trong khi lệnh thứ hai cung cấp thông tin chi tiết về một chỉ mục cụ thể.

PRAGMA journal_mode

PRAGMA journal_mode kiểm soát cách SQLite theo dõi các giao dịch. Nó giống như việc chọn giữa các loại hệ thống sao lưu khác nhau.

PRAGMA journal_mode = WAL;

Điều này đặt chế độ journal thành Write-Ahead Logging (WAL), có thể cải thiện hiệu suất trong nhiều trường hợp.

PRAGMA max_page_count và PRAGMA page_count

Những PRAGMA này liên quan đến số lượng trang trong tệp cơ sở dữ liệu của bạn. Chúng giống như việc đặt và kiểm tra số lượng trang tối đa trong một cuốn sách.

PRAGMA max_page_count = 1000000;
PRAGMA page_count;

Lệnh đầu tiên đặt số lượng trang tối đa, trong khi lệnh thứ hai cho bạn biết số lượng trang hiện tại đang được sử dụng.

PRAGMA page_size

PRAGMA này đặt hoặc truy vấn kích thước trang của cơ sở dữ liệu. Nó giống như việc quyết định kích thước mỗi trang trong cuốn sách của bạn.

PRAGMA page_size = 4096;

Điều này đặt kích thước trang thành 4096 byte, đây là một lựa chọn phổ biến.

PRAGMA parser_trace và PRAGMA sql_trace

Những PRAGMA này giống như việc bật chế độ gỡ lỗi cho cơ sở dữ liệu của bạn. Chúng cung cấp thông tin chi tiết về cách SQLite xử lý các lệnh của bạn.

PRAGMA parser_trace = ON;
PRAGMA sql_trace = ON;

Những lệnh này rất hữu ích khi bạn cố gắng hiểu tại sao một truy vấn cụ thể không hoạt động như mong đợi.

PRAGMA recursive_triggers

PRAGMA này kiểm soát xem các trigger có thể bắn ra các trigger khác một cách đệ quy hay không. Nó giống như việc cho phép hiệu ứng domino trong cơ sở dữ liệu của bạn.

PRAGMA recursive_triggers = ON;

Với thiết lập này, một trigger có thể gây ra một trigger khác bắn ra, có thể gây ra một trigger khác bắn ra, và vân vân.

PRAGMA schema_version và PRAGMA user_version

Những PRAGMA này cho phép bạn đặt và truy vấn số phiên bản cho schema của cơ sở dữ liệu. Chúng giống như các thẻ phiên bản cho cấu trúc cơ sở dữ liệu của bạn.

PRAGMA schema_version;
PRAGMA user_version = 1;

Lệnh đầu tiên truy vấn phiên bản schema hiện tại, trong khi lệnh thứ hai đặt phiên bản người dùng thành 1.

PRAGMA secure_delete

PRAGMA này kiểm soát cách SQLite ghi đè dữ liệu đã xóa. Nó giống như việc chọn giữa việc shredding tài liệu của bạn hoặc chỉ đơn giản là bỏ chúng vào thùng rác.

PRAGMA secure_delete = ON;

Với thiết lập này, SQLite sẽ ghi đè dữ liệu đã xóa bằng zeros, làm cho việc khôi phục dữ liệu khó khăn hơn.

PRAGMA synchronous

PRAGMA này kiểm soát cách SQLite viết dữ liệu vào đĩa. Nó là sự cân bằng giữa an toàn và tốc độ.

PRAGMA synchronous = NORMAL;

Điều này đặt mức độ an toàn ở mức trung bình, cân bằng giữa an toàn tối đa (FULL) và tốc độ tối đa (OFF).

PRAGMA temp_store và PRAGMA temp_store_directory

Những PRAGMA này kiểm soát nơi và cách SQLite lưu trữ dữ liệu tạm thời. Nó giống như việc chọn nơi để đặt giấy nháp khi bạn làm việc.

PRAGMA temp_store = MEMORY;
PRAGMA temp_store_directory = '/path/to/directory';

Lệnh đầu tiên chỉ định SQLite lưu trữ dữ liệu tạm thời trong bộ nhớ, trong khi lệnh thứ hai chỉ định thư mục cho các tệp tạm thời.

PRAGMA writable_schema

PRAGMA này kiểm soát xem bạn có thể chỉnh sửa bảng sqlite_master trực tiếp hay không. Nó giống như việc có một chìa khóa.master cho cấu trúc cơ sở dữ liệu của bạn.

PRAGMA writable_schema = ON;

Hãy rất cẩn thận với điều này! Nó cho phép bạn thay đổi cấu trúc cơ bản của cơ sở dữ liệu của bạn, điều này có thể nguy hiểm nếu không được thực hiện đúng cách.

Dưới đây là bảng tóm tắt tất cả các PRAGMA mà chúng ta đã thảo luận:

PRAGMA Mô tả
auto_vacuum Kiểm soát tự động vacuuming của cơ sở dữ liệu
cache_size Đặt số lượng trang giữ trong bộ nhớ
case_sensitive_like Kiểm soát tính phân biệt chữ cái của LIKE operator
count_changes Báo cáo số lượng hàng thay đổi bởi các thao tác
database_list Liệt kê các cơ sở dữ liệu đã gắn kết
encoding Đặt hoặc truy vấn mã hóa văn bản của cơ sở dữ liệu
freelist_count Báo cáo số lượng trang trống trong tệp cơ sở dữ liệu
index_info Cung cấp thông tin về một chỉ mục cụ thể
index_list Liệt kê tất cả các chỉ mục trên một bảng
journal_mode Kiểm soát cách theo dõi giao dịch
max_page_count Đặt số lượng trang tối đa trong cơ sở dữ liệu
page_count Báo cáo số lượng trang hiện tại trong cơ sở dữ liệu
page_size Đặt hoặc truy vấn kích thước trang của cơ sở dữ liệu
parser_trace Bật thông tin phân tích chi tiết
recursive_triggers Cho phép trigger bắn ra các trigger khác một cách đệ quy
schema_version Đặt hoặc truy vấn số phiên bản schema
secure_delete Kiểm soát cách ghi đè dữ liệu đã xóa
sql_trace Bật thông tin thực thi SQL chi tiết
synchronous Kiểm soát cách dữ liệu được viết vào đĩa
temp_store Kiểm soát nơi dữ liệu tạm thời được lưu trữ
temp_store_directory Đặt thư mục cho các tệp tạm thời
user_version Đặt hoặc truy vấn số phiên bản người dùng
writable_schema Cho phép chỉnh sửa bảng sqlite_master trực tiếp

Và như vậy, bạn đã có足够的装备来开始尝试SQLite的PRAGMA了。记住,这些强大的工具可以显著影响数据库的行为和性能,所以总是在生产环境中使用之前彻底测试。快乐编码!

Credits: Image by storyset