Lập chỉ mục cơ sở dữ liệu là cách phổ biến nhất được các nhà phát triển chương trình phụ trợ biết đến và sử dụng để tối ưu hóa các truy vấn cơ sở dữ liệu. Trong bài này, chúng ta sẽ thảo luận chi tiết về lập chỉ mục cơ sở dữ liệu.
Chỉ mục cơ sở dữ liệu cho phép truy vấn lấy dữ liệu từ cơ sở dữ liệu một cách hiệu quả. Nói một cách đơn giản hơn, lập chỉ mục là một cách để đưa một bảng không có thứ tự vào một thứ tự sẽ tối đa hóa hiệu quả khi tìm kiếm một bản ghi.
Các chỉ mục có thể liên quan đến các bảng cụ thể và bao gồm một hoặc nhiều khóa. Ngoài ra, một bảng có thể có nhiều chỉ mục được xây dựng từ nó.
Khi một bảng cơ sở dữ liệu không được lập chỉ mục, sẽ không có bất kỳ thứ tự rõ ràng nào của các hàng, do đó, để thực hiện bất kỳ truy vấn nào, nó sẽ cần phải tìm kiếm tuyến tính qua các hàng, nghĩa là, truy vấn sẽ phải tìm kiếm qua từng hàng để tìm. các hàng với điều kiện phù hợp. Như bạn có thể tưởng tượng, điều này không lý tưởng và có thể là một vấn đề khi nhìn vào bên trong một bảng cơ sở dữ liệu với lượng dữ liệu khổng lồ.
Ví dụ, chúng ta có một bảng như hình dưới đây:
COMPANY_ID | ĐƠN VỊ | ĐƠN GIÁ |
---|---|---|
10 | 12 | 1,15 |
12 | 12 | 1,05 |
14 | 18 | 1,31 |
18 | 18 | 1,34 |
11 | 24 | 1,15 |
16 | 12 | 1,31 |
10 | 12 | 1,15 |
12 | 24 | 1,3 |
18 | 6 | 1,34 |
18 | 12 | 1,35 |
14 | 12 | 1,95 |
21 | 18 | 1,36 |
12 | 12 | 1,05 |
20 | 6 | 1,31 |
18 | 18 | 1,34 |
11 | 24 | 1,15 |
14 | 24 | 1,05 |
Và sau đó, chúng tôi muốn chạy một truy vấn như sau:
SELECT company_id, units, unit_cost FROM index_test WHERE company_id = 18
Trong trường hợp cụ thể này, cơ sở dữ liệu sẽ phải tìm kiếm qua tất cả 17 bản ghi theo thứ tự chúng xuất hiện trong bảng, từ trên xuống dưới, từng bản ghi một, để tìm kiếm tất cả các trường hợp tiềm năng của company_id
là 18.
Việc này sẽ ngày càng tốn nhiều thời gian hơn khi kích thước của bàn tăng lên. Làm thế nào lập chỉ mục có thể giúp đỡ ở đây? Lập chỉ mục có thể giúp chúng tôi thiết lập cột có điều kiện tìm kiếm bật (trong trường hợp này là company_id
) theo cách được sắp xếp để tối ưu hóa hiệu suất truy vấn.
Với một chỉ mục trên cột company_id
, bảng sẽ giống như sau:
COMPANY_ID | ĐƠN VỊ | ĐƠN GIÁ |
---|---|---|
10 | 12 | 1,15 |
10 | 12 | 1,15 |
11 | 24 | 1,15 |
11 | 24 | 1,15 |
12 | 12 | 1,05 |
12 | 24 | 1,3 |
12 | 12 | 1,05 |
14 | 18 | 1,31 |
14 | 12 | 1,95 |
14 | 24 | 1,05 |
16 | 12 | 1,31 |
18 | 18 | 1,34 |
18 | 6 | 1,34 |
18 | 12 | 1,35 |
18 | 18 | 1,34 |
20 | 6 | 1,31 |
21 | 18 | 1,36 |
Bây giờ, cơ sở dữ liệu có thể chỉ cần tìm kiếm company_id
bằng 18 và trả về tất cả các cột được yêu cầu cho hàng đó, rồi chuyển sang hàng tiếp theo. Nếu hàng tiếp theo cũng có company_id
là 18 một lần nữa, thì nó cũng sẽ trả về các cột yêu cầu cho hàng này, nhưng nếu hàng tiếp theo có company_id
là 18, cơ sở dữ liệu biết rằng nó có thể dừng tìm kiếm ở đây và kết thúc phản hồi .
Đây là một lời giải thích khá đơn giản về chỉ mục cơ sở dữ liệu là gì và chúng có thể làm gì, nhưng còn nhiều điều khác đang diễn ra trong quá trình này. Hãy cùng tìm hiểu sâu hơn về cách hoạt động của lập chỉ mục.
Trong thực tế, bảng cơ sở dữ liệu không tự sắp xếp lại mỗi khi điều kiện truy vấn thay đổi để tối ưu hóa hiệu suất cơ sở dữ liệu nhưng thực tế xảy ra là chỉ mục làm cho cơ sở dữ liệu tạo ra một cấu trúc dữ liệu riêng biệt có thể dễ dàng sắp xếp.
Điều quan trọng cần lưu ý là khi một chỉ mục được tạo trên một cột trong cơ sở dữ liệu, nó sẽ tạo ra cấu trúc dữ liệu trên cột cụ thể đó và không có cột nào khác được lưu trữ trong cấu trúc dữ liệu này. Ví dụ: trong ví dụ trên, cấu trúc dữ liệu của chúng ta sẽ chỉ chứa company_id
và không có các cột khác như unit
hoặc unit_cost
.
Nhưng một câu hỏi hợp pháp bật lên ở đây - làm thế nào để cơ sở dữ liệu biết những trường khác trong bảng sẽ được trả về cho một truy vấn. Chúng ta hãy cố gắng để hiểu làm thế nào.
Các chỉ mục cơ sở dữ liệu lưu trữ các con trỏ để tham chiếu thông tin đơn giản cho vị trí của thông tin bổ sung trong bộ nhớ. Nói cách khác, chỉ mục lưu company_id
và địa chỉ của hàng cụ thể đó trong bộ nhớ. Trong ví dụ này, chỉ mục cơ sở dữ liệu sẽ trông giống như sau:
COMPANY_ID | POINTER |
---|---|
10 | _123 |
10 | _129 |
11 | _127 |
11 | _138 |
12 | _124 |
12 | _130 |
12 | _135 |
14 | _125 |
14 | _131 |
14 | _133 |
16 | _128 |
18 | _126 |
18 | _131 |
18 | _132 |
18 | _137 |
20 | _136 |
21 | _134 |
Với chỉ mục này, truy vấn có thể kiểm tra các hàng trong cột company_id
có giá trị là 18 và sau đó sử dụng con trỏ, nó có thể tìm thông tin liên quan cho bản ghi đó.
Sau khi hiểu những gì chúng ta mong đợi từ chỉ mục, hãy xem các cấu trúc dữ liệu phổ biến có thể được sử dụng để lập chỉ mục cơ sở dữ liệu:
B-tree là cấu trúc dữ liệu chỉ mục thường được sử dụng nhất vì chúng nhanh chóng cho việc tra cứu, xóa và chèn. Tất cả các phép toán này đều có thể thực hiện được theo thời gian logarit và dữ liệu chứa trong cây B có thể được sắp xếp dễ dàng.
Chỉ mục băm thường được sử dụng để mô tả các chỉ mục sử dụng bảng băm . Vì bảng băm đặc biệt hiệu quả trong việc tra cứu dữ liệu, các truy vấn tìm kiếm kết hợp chính xác có thể được xử lý nhanh chóng. Chìa khóa trong chỉ mục băm là giá trị cột và giá trị trong bảng băm là tham chiếu đến dữ liệu hàng của bảng.
Mặt khác, bảng băm không phải là cấu trúc dữ liệu có thứ tự; do đó, chúng có thể không hiệu quả đối với các loại tìm kiếm khác.
R-tree thường được sử dụng trong cơ sở dữ liệu không gian, thường được sử dụng để lập chỉ mục thông tin đa chiều như tọa độ địa lý, hình chữ nhật, đa giác, v.v. Nó hữu ích cho các tìm kiếm như "tìm tất cả các quán cà phê trong vòng 2 dặm từ vị trí của tôi."
Chỉ mục bitmap hữu ích cho các cột có số lần xuất hiện cao của các giá trị như vậy, tức là các cột có độ chọn lọc thấp. Ví dụ: hãy xem xét một cột có giá trị boolean.
Các chỉ mục được thiết kế để tăng hiệu suất cơ sở dữ liệu; do đó, lập chỉ mục có thể được sử dụng bất cứ khi nào chúng ta cần cải thiện đáng kể hiệu suất cơ sở dữ liệu. Cơ sở dữ liệu của bạn càng mở rộng, thì khả năng lập chỉ mục càng có lợi cho bạn.
Tuy nhiên, điều đầu tiên và quan trọng nhất cần nhớ là chỉ mục chiếm thêm không gian; do đó, bảng càng lớn thì chỉ số càng lớn. Mỗi khi bạn thực hiện thao tác thêm, xóa hoặc cập nhật, thao tác tương tự cũng sẽ cần được thực hiện trên chỉ mục.
Khi dữ liệu được ghi vào cơ sở dữ liệu, bảng gốc được cập nhật đầu tiên, tiếp theo là các chỉ mục khác dựa trên bảng đó. Khi một quá trình ghi được thực hiện vào cơ sở dữ liệu, các chỉ mục sẽ không thể hoạt động cho đến khi chúng được cập nhật. Các chỉ mục sẽ không bao giờ hoạt động nếu cơ sở dữ liệu liên tục được ghi.
Đây là lý do tại sao các chỉ mục thường được áp dụng cho cơ sở dữ liệu trong kho dữ liệu nhận dữ liệu mới trên cơ sở có kế hoạch (trong giờ thấp điểm) hơn là cơ sở dữ liệu sản xuất có thể nhận các lần ghi mới.
Đoạn mã sau cho biết cách tạo chỉ mục trên một cột trong cơ sở dữ liệu SQL:
CREATE INDEX name_index ON Employee (Employee_Name);
Nếu bạn muốn tạo một chỉ mục trên nhiều cột, lệnh SQL sẽ giống như sau:
CREATE INDEX name_index ON Employee (Employee_Name, Employee_Age);
Nói chung, một chỉ mục chỉ nên được xây dựng trên một bảng nếu dữ liệu trong cột được lập chỉ mục sẽ được truy cập thường xuyên.
Vì vậy, chúng ta đã thảo luận chi tiết về lập chỉ mục cơ sở dữ liệu trong bài viết này và cũng đã tìm hiểu về các cấu trúc dữ liệu được sử dụng để thực hiện lập chỉ mục cơ sở dữ liệu và cũng như khi nào thì nên sử dụng chỉ mục và các cách khác.
Để tổng hợp mọi thứ, đây là một bản tóm tắt nhanh:
Đây là tất cả cho bài viết này. Lập chỉ mục cơ sở dữ liệu là một chủ đề rộng lớn và hơi phức tạp, tôi hy vọng bài viết này sẽ hữu ích trong việc hiểu những điều cơ bản về khái niệm này.
Hãy đọc tiếp!