Lập chỉ mục làm gì?
Lập chỉ mục là 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ả của truy vấn trong khi tìm kiếm.
Khi một bảng không được lập chỉ mục, thứ tự của các hàng có thể sẽ không được phân biệt rõ ràng bởi truy vấn được tối ưu hóa theo bất kỳ cách nào và do đó truy vấn của bạn sẽ phải tìm kiếm tuyến tính qua các hàng. Nói cách khác, các truy vấn sẽ phải tìm kiếm qua từng hàng để tìm các hàng phù hợp với các điều kiện. Như bạn có thể tưởng tượng, điều này có thể mất nhiều thời gian. Xem qua từng hàng không hiệu quả lắm.
Ví dụ:bảng bên dưới đại diện cho một bảng trong một nguồn dữ liệu hư cấu, hoàn toàn không có thứ tự.
company_id | đơn vị | unit_cost |
---|---|---|
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 |
Nếu chúng tôi chạy truy vấn sau:
SELECT
company_id,
units,
unit_cost
FROM
index_test
WHERE
company_id = 18
Cơ sở dữ liệu sẽ phải tìm kiếm qua tất cả 17 hàng theo thứ tự chúng xuất hiện trong bảng, từ trên xuống dưới, từng hàng một. Vì vậy, để tìm kiếm tất cả các phiên bản tiềm năng của company_id
số 18, cơ sở dữ liệu phải xem qua toàn bộ bảng cho tất cả các lần xuất hiện của 18 trong company_id
cột.
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. Khi độ phức tạp của dữ liệu tăng lên, điều cuối cùng có thể xảy ra là một bảng có một tỷ hàng được nối với một bảng khác có một tỷ hàng; truy vấn bây giờ phải tìm kiếm qua số lượng hàng gấp đôi số lượng hàng tốn gấp đôi lượng thời gian.
Bạn có thể thấy điều này trở thành vấn đề như thế nào trong thế giới dữ liệu luôn bão hòa của chúng ta. Các bảng tăng kích thước và thời gian thực thi tìm kiếm tăng.
Truy vấn một bảng chưa lập chỉ mục, nếu được trình bày trực quan, sẽ trông giống như sau:
Việc lập chỉ mục làm là thiết lập cột mà bạn đang sử dụng các điều kiện tìm kiếm theo thứ tự được sắp xếp để hỗ trợ tối ưu hóa hiệu suất truy vấn.
Với một chỉ mục trên company_id
, về cơ bản, bảng sẽ "trông" như thế này:
company_id | đơn vị | unit_cost |
---|---|---|
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ể tìm kiếm company_id
đánh số 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 comapny_id
của hàng tiếp theo số cũng là 18 thì nó sẽ trả về tất cả các cột được yêu cầu trong truy vấn. Nếu company_id
của hàng tiếp theo là 20, truy vấn biết ngừng tìm kiếm và truy vấn sẽ kết thúc.
Lập chỉ mục hoạt động như thế nào?
Trong thực tế, bảng cơ sở dữ liệu không tự sắp xếp lại mỗi khi các điều kiện truy vấn thay đổi để tối ưu hóa hiệu suất truy vấn:điều đó sẽ không thực tế. Trong thực tế, điều xảy ra là chỉ mục khiến cơ sở dữ liệu tạo ra cấu trúc dữ liệu. Kiểu cấu trúc dữ liệu rất có thể là B-Tree. Mặc dù những ưu điểm của B-Tree là rất nhiều, nhưng ưu điểm chính cho mục đích của chúng tôi là nó có thể sắp xếp được. Khi cấu trúc dữ liệu được sắp xếp theo thứ tự, nó làm cho việc tìm kiếm của chúng tôi hiệu quả hơn vì những lý do rõ ràng mà chúng tôi đã chỉ ra ở trên.
Khi chỉ mục tạo cấu trúc dữ liệu trên một cột cụ thể, điều quan trọng cần lưu ý là không có cột nào khác được lưu trữ trong cấu trúc dữ liệu. Cấu trúc dữ liệu của chúng tôi cho bảng trên sẽ chỉ chứa company_id
những con số. Đơn vị và unit_cost
sẽ không được giữ trong cấu trúc dữ liệu.
Làm thế nào để Cơ sở dữ liệu biết Các trường Khác trong Bảng để Trả lại?
Các chỉ mục cơ sở dữ liệu cũng sẽ lưu trữ các con trỏ chỉ là thông tin tham chiếu cho vị trí của thông tin bổ sung trong bộ nhớ. Về cơ bản, chỉ mục chứa company_id
và địa chỉ nhà của hàng cụ thể đó trên đĩa nhớ. Chỉ mục sẽ thực sự trông như thế này:
company_id | con trỏ |
---|---|
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 đó, truy vấn chỉ có thể tìm kiếm các hàng trong company_id
cột có 18 và sau đó sử dụng con trỏ có thể đi vào bảng để tìm hàng cụ thể nơi con trỏ đó tồn tại. Sau đó, truy vấn có thể đi vào bảng để truy xuất các trường cho các cột được yêu cầu cho các hàng đáp ứng các điều kiện.
Nếu tìm kiếm được trình bày trực quan, nó sẽ giống như sau:
Tóm tắt
- Lập chỉ mục thêm cấu trúc dữ liệu với các cột cho điều kiện tìm kiếm và một con trỏ
- Con trỏ là địa chỉ trên đĩa nhớ của hàng với phần còn lại của thông tin
- Cấu trúc dữ liệu chỉ mục được sắp xếp để tối ưu hóa hiệu quả truy vấn
- Truy vấn tìm kiếm hàng cụ thể trong chỉ mục; chỉ mục đề cập đến con trỏ sẽ tìm thấy phần còn lại của thông tin.
- Chỉ mục làm giảm số hàng mà truy vấn phải tìm kiếm từ 17 xuống 4.