Tóm tắt :trong hướng dẫn này, bạn sẽ học cách sử dụng chỉ mục SQLite để truy vấn dữ liệu nhanh hơn, tăng tốc hoạt động sắp xếp và thực thi các ràng buộc duy nhất.
Chỉ mục là gì?
Trong cơ sở dữ liệu quan hệ, bảng là danh sách các hàng. Đồng thời, mỗi hàng có cấu trúc cột giống nhau bao gồm các ô. Mỗi hàng cũng có một số thứ tự rowid liên tiếp được sử dụng để xác định hàng. Do đó, bạn có thể coi một bảng là danh sách các cặp:(rowid, row).
Không giống như một bảng, một chỉ mục có mối quan hệ ngược lại:(row, rowid). Chỉ mục là một cấu trúc dữ liệu bổ sung giúp cải thiện hiệu suất của truy vấn.
SQLite sử dụng B-tree để tổ chức các chỉ mục. Lưu ý rằng B viết tắt của balance, B-tree là cây cân bằng, không phải cây nhị phân.
Cây B giữ cho lượng dữ liệu ở cả hai phía của cây được cân bằng để số lượng mức phải được duyệt qua để xác định một hàng luôn ở cùng một số gần đúng. Ngoài ra, truy vấn bằng cách sử dụng đẳng thức (=) và phạm vi (>,> =, <, <=) trên các chỉ mục cây B rất hiệu quả.
Chỉ mục hoạt động như thế nào
Mỗi chỉ mục phải được liên kết với một bảng cụ thể. Chỉ mục bao gồm một hoặc nhiều cột, nhưng tất cả các cột của chỉ mục phải nằm trong cùng một bảng. Một bảng có thể có nhiều chỉ mục.
Bất cứ khi nào bạn tạo chỉ mục, SQLite sẽ tạo cấu trúc B-tree để giữ dữ liệu chỉ mục.
Chỉ mục chứa dữ liệu từ các cột mà bạn chỉ định trong chỉ mục và rowid
tương ứng giá trị. Điều này giúp SQLite nhanh chóng xác định vị trí hàng dựa trên giá trị của các cột được lập chỉ mục.
Hãy tưởng tượng một chỉ mục trong cơ sở dữ liệu giống như chỉ mục của một cuốn sách. Bằng cách xem chỉ mục, bạn có thể nhanh chóng xác định số trang dựa trên các từ khóa.
SQLite CREATE INDEX
tuyên bố
Để tạo chỉ mục, bạn sử dụng CREATE INDEX
câu lệnh với cú pháp sau:
CREATE [UNIQUE] INDEX index_name
ON table_name(column_list);
Code language: SQL (Structured Query Language) (sql)
Để tạo chỉ mục, bạn chỉ định ba thông tin quan trọng:
- Tên của chỉ mục sau
CREATE INDEX
từ khóa. - Thuộc về tên của bảng trong chỉ mục.
- Danh sách các cột của chỉ mục.
Trong trường hợp bạn muốn đảm bảo rằng các giá trị trong một hoặc nhiều cột là duy nhất như email và điện thoại, bạn sử dụng UNIQUE
trong CREATE INDEX
tuyên bố. CREATE UNIQUE INDEX
tạo một chỉ mục duy nhất mới.
SQLite UNIQUE
ví dụ về chỉ mục
Hãy tạo một bảng mới có tên contacts
để trình diễn.
CREATE TABLE contacts (
first_name text NOT NULL,
last_name text NOT NULL,
email text NOT NULL
);
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Giả sử, bạn muốn bắt buộc rằng email là duy nhất, bạn tạo một chỉ mục duy nhất như sau:
CREATE UNIQUE INDEX idx_contacts_email
ON contacts (email);
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Để kiểm tra điều này.
Đầu tiên, hãy chèn một hàng vào contacts
bảng.
INSERT INTO contacts (first_name, last_name, email)
VALUES('John','Doe','[email protected]');
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Thứ hai, chèn một hàng khác có email trùng lặp.
INSERT INTO contacts (first_name, last_name, email)
VALUES('Johny','Doe','[email protected]');
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
SQLite đã đưa ra một thông báo lỗi chỉ ra rằng chỉ mục duy nhất đã bị vi phạm. Bởi vì khi bạn chèn hàng thứ hai, SQLite đã kiểm tra và đảm bảo rằng email là duy nhất trên các hàng trong email
của contacts
bảng.
Hãy chèn thêm hai hàng vào contacts
bảng.
INSERT INTO contacts (first_name, last_name, email)
VALUES('David','Brown','[email protected]'),
('Lisa','Smith','[email protected]');
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Nếu bạn truy vấn dữ liệu từ contacts
dựa trên một email cụ thể, SQLite sẽ sử dụng chỉ mục để định vị dữ liệu. Xem tuyên bố sau:
SELECT
first_name,
last_name,
email
FROM
contacts
WHERE
email = '[email protected]';
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Để kiểm tra xem SQLite có sử dụng chỉ mục hay không, bạn sử dụng EXPLAIN QUERY PLAN
tuyên bố như sau:
EXPLAIN QUERY PLAN
SELECT
first_name,
last_name,
email
FROM
contacts
WHERE
email = '[email protected]';
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Ví dụ về chỉ mục đa cột trong SQLite
Nếu bạn tạo chỉ mục bao gồm một cột, SQLite sử dụng cột đó làm khóa sắp xếp. Trong trường hợp bạn tạo chỉ mục có nhiều cột, SQLite sử dụng các cột bổ sung làm cột thứ hai, thứ ba,… làm khóa sắp xếp.
SQLite sắp xếp dữ liệu trên chỉ mục đa cột theo cột đầu tiên được chỉ định trong CREATE INDEX
tuyên bố. Sau đó, nó sắp xếp các giá trị trùng lặp theo cột thứ hai, v.v.
Do đó, thứ tự cột rất quan trọng khi bạn tạo chỉ mục nhiều cột.
Để sử dụng chỉ mục nhiều cột, truy vấn phải chứa điều kiện có cùng thứ tự cột như được xác định trong chỉ mục.
Câu lệnh sau tạo chỉ mục nhiều cột trên first_name
và last_name
các cột của contacts
bảng:
CREATE INDEX idx_contacts_name
ON contacts (first_name, last_name);
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
Nếu bạn truy vấn contacts
bảng với một trong các điều kiện sau trong WHERE
, SQLite sẽ sử dụng chỉ mục đa cột để tìm kiếm dữ liệu.
1) lọc dữ liệu theo first_name
cột.
WHERE
first_name = 'John';
Code language: SQL (Structured Query Language) (sql)
2) lọc dữ liệu theo cả first_name
và last_name
cột:
WHERE
first_name = 'John' AND last_name = 'Doe';
Code language: SQL (Structured Query Language) (sql)
Tuy nhiên, SQLite sẽ không sử dụng chỉ mục đa cột nếu bạn sử dụng một trong các điều kiện sau.
1) lọc theo last_name
chỉ cột.
WHERE
last_name = 'Doe';
Code language: SQL (Structured Query Language) (sql)
2) lọc theo first_name
HOẶC last_name
cột.
last_name = 'Doe' OR first_name = 'John';
Code language: SQL (Structured Query Language) (sql)
SQLite Show Indexes
Để tìm tất cả các chỉ mục được liên kết với một bảng, bạn sử dụng lệnh sau:
PRAGMA index_list('table_name');
Code language: SQL (Structured Query Language) (sql)
Ví dụ:câu lệnh này hiển thị tất cả các chỉ mục của contacts
bảng:
PRAGMA index_list('playlist_track');
Code language: SQL (Structured Query Language) (sql)
Đây là kết quả:
Để nhận thông tin về các cột trong chỉ mục, bạn sử dụng lệnh sau:
PRAGMA index_info('idx_contacts_name');
Code language: SQL (Structured Query Language) (sql)
Ví dụ này trả về danh sách cột của chỉ mục idx_contacts_name
:
Một cách khác để lấy tất cả các chỉ mục từ cơ sở dữ liệu là truy vấn từ sqlite_master
bảng:
SELECT
type,
name,
tbl_name,
sql
FROM
sqlite_master
WHERE
type= 'index';
Code language: SQL (Structured Query Language) (sql)
SQLite DROP INDEX
tuyên bố
Để xóa chỉ mục khỏi cơ sở dữ liệu, bạn sử dụng DROP INDEX
tuyên bố như sau:
DROP INDEX [IF EXISTS] index_name;
Code language: SQL (Structured Query Language) (sql)
Trong cú pháp này, bạn chỉ định tên của chỉ mục mà bạn muốn thả sau DROP INDEX
từ khóa. IF EXISTS
tùy chọn chỉ xóa một chỉ mục nếu nó tồn tại.
Ví dụ:bạn sử dụng câu lệnh sau để xóa idx_contacts_name
chỉ mục:
DROP INDEX idx_contacts_name;
Code language: SQL (Structured Query Language) (sql)
Hãy thử nó
idx_contacts_name
chỉ mục bị xóa hoàn toàn khỏi cơ sở dữ liệu.
Trong hướng dẫn này, bạn đã học về chỉ mục SQLite và cách sử dụng chỉ mục để cải thiện hiệu suất của truy vấn hoặc thực thi các ràng buộc duy nhất.