SQLite
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> SQLite

Chỉ mục SQLite

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_namelast_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_namelast_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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Các kiểu dữ liệu SQLite

  2. Chỉnh sửa Kết quả Tr.bình () của bạn trong SQLite với Từ khoá DISTINCT

  3. Cách cập nhật dữ liệu trong Hộp thoại tùy chỉnh

  4. Tại sao tôi nhận được java.lang.IllegalArgumentException:giá trị ràng buộc tại chỉ mục 1 là null trong trường hợp này?

  5. Cách phát triển một ứng dụng Android gốc ngoại tuyến ưu tiên