Index trong SQLite
Trong bài học hôm nay chúng ta sẽ cùng tìm hiểu về một khái niệm khá quan trong SQLite đó là index. Vậy index là gì? Có mấy loại index? Khi nào nên sử dụng và khi nào không nên sử dụng index? Chúng ta sẽ cùng tìm hiểu trong nội dung tiếp theo.
1. Index trong SQLite là gì?
Index là bảng tra cứu đặc biệt mà database search engine
có thể sử dụng để tăng tốc độ truy xuất dữ liệu. Nói một cách đơn giản, một index là một con trỏ tới dữ liệu trong một bảng. Một index trong cơ sở dữ liệu rất giống với mục lục của một cuốn sách.
Ví dụ trong thực tế nếu bạn muốn tham khảo tất cả các trang trong một cuốn sách thảo luận về một chủ đề nhất định nào đó, trước tiên bạn cần tham khảo mục lục, liệt kê tất cả các chủ đề theo thứ tự bảng chữ cái và sau đó tham chiếu đến một hoặc nhiều số trang cụ thể.
Một index giúp tăng tốc các truy vấn SELECT
và các mệnh đề WHERE
, nhưng nó làm chậm việc dữ liệu nhập vào với các câu lệnh UPDATE
và INSERT
. Các index có thể được tạo hoặc xóa đi mà không ảnh hưởng đến dữ liệu.
Bài viết này được đăng tại [free tuts .net]
Để tạo một index chúng ta sử dụng câu lệnh CREATE INDEX
, chúng ta có thể đặt tên cho index, chỉ rõ bảng và cột hoặc nhiều cột để tạo index và thiết lập index đó theo thứ tự tăng dần hay giảm dần.
Các index cũng có thể là duy nhất, tương tự như ràng buộc UNIQUE
, trong đó index ngăn các bản sao trong một cột hoặc kết hợp các cột có index.
2. Lệnh CREATE INDEX trong SQLite
Sau đây là cú pháp cơ bản của CREATE INDEX
trong SQLite
.
CREATE INDEX index_name ON table_name;
Single-Column Index trong SQLite
Single-Column index
là một index được tạo dựa trên chỉ một cột trong bảng. Cú pháp như sau:
CREATE INDEX index_name ON table_name (column_name);
Unique Index trong SQLite
Unique index
trong SQLite
được sử dụng không chỉ cho việc tăng hiệu suất, mà còn cho tính toàn vẹn dữ liệu. Unique index
không cho phép bất kỳ giá trị trùng lặp nào được chèn vào bảng. Cú pháp như sau:
CREATE UNIQUE INDEX index_name on table_name (column_name);
Composite Index trong SQLite
Composite Index
là một index cho hai hoặc nhiều cột của bảng. Cú pháp như sau:
CREATE INDEX index_name on table_name (column1, column2);
Dù là tạo Single-column index
hoặc một Composite index
, hãy cân nhắc các cột mà bạn có thể sử dụng thường xuyên trong mệnh đề WHERE
của một truy vấn như là điều kiện lọc.
Nếu chỉ có một cột trong bảng được sử dụng, thì lựa chọn tốt nhất sẽ là single-column index
. Nếu có hai hoặc nhiều cột thường được sử dụng trong mệnh đề WHERE
như là bộ lọc, thì composite index
sẽ là lựa chọn tốt nhất.
Implicit Index trong SQLite
Implicit index
là các index được tự động tạo bởi máy chủ cơ sở dữ liệu khi một đối tượng được tạo. Các index được tự động tạo cho các ràng buộc khóa chính và các ràng buộc duy nhất.
3. Ví dụ Index trong SQLite
Ví dụ sau đây chúng ta sẽ tạo một index cho cột salary
trong bảng COMPANY
.
sqlite> CREATE INDEX salary_index ON COMPANY (salary);
Bây giờ chúng ta có thể liệt kê tất cả các index có sẵn trong bảng COMPANY
bằng cách sử dụng lệnh .indices
như sau:
sqlite> .indices COMPANY
Điều này sẽ tạo ra kết quả sau, trong đó sqlite_autoindex_COMPANY_1 là một implicit index
được tạo khi chính bảng COMPANY
được tạo.
salary_index sqlite_autoindex_COMPANY_1
Bạn có thể liệt kê tất cả index trong database như sau:
sqlite> SELECT * FROM sqlite_master WHERE type = 'index';
4. Lệnh DROP INDEX trong SQLite
Để xóa index trong SQLite
các bạn có thể sử dụng lệnh DROP
. Các bạn cần phải thận trọng khi xóa index vì hiệu suất có thể bị chậm hơn hoặc không được cải thiện.
Cú pháp như sau:
DROP INDEX index_name;
Bạn có thể sử dụng câu lệnh sau để xóa index đã tạo trước đó.
sqlite> DROP INDEX salary_index;
5. Khi nào nên tránh tạo index trong SQLite
Mặc dù các index được sử dụng để tăng cường hiệu suất của cơ sở dữ liệu, nhưng có một số trường hợp chúng ta không nên sử dụng index. Các hướng dẫn sau đây cho biết khi nào chúng ta không nên sử dụng index.
Index không nên được sử dụng trong các trường hợp sau:
- Các bảng nhỏ
- Các bạn có các hoạt động update hoặc insert thường xuyên
- Các cột chứa số lượng lớn giá trị null
- Các cột thường xuyên bị sửa đổi