Chỉ mục cơ sở dữ liệu được sử dụng để tăng tốc các hoạt động bảng khác nhau. Tuy nhiên trước khi bạn tạo chỉ mục, điều quan trọng là bạn phải biết liệu bạn có thực sự cần chỉ mục hay không? Và nếu bạn cần tạo một chỉ mục thì những điểm quan trọng cần phải lưu ý là gì? Đây là lúc thiết kế chỉ mục cơ sở dữ liệu xuất hiện.
Bài viết này nhằm mục đích trả lời những câu hỏi này về thiết kế chỉ mục cơ sở dữ liệu và làm sáng tỏ một số lưu ý chính mà nhà phát triển cơ sở dữ liệu nên tính đến khi thiết kế Chỉ mục.
1. Kích thước bảng
Câu hỏi đầu tiên mà một nhà phát triển cơ sở dữ liệu phải hỏi trước khi tạo một chỉ mục là liệu bảng có đủ lớn để sử dụng các chỉ mục một cách hiệu quả hay không. Nếu kích thước bảng nhỏ, công cụ SQL Server có thể quét toàn bộ bảng nhanh hơn so với tìm kiếm bảng thông qua chỉ mục. Các chỉ mục trong trường hợp này không được sử dụng và tạo ra một chi phí trong khi thực hiện các hoạt động cơ sở dữ liệu.
2. Các loại cột
Chỉ mục phải được tạo trên cột khóa chính hoặc bất kỳ cột nào chứa các giá trị duy nhất và có ràng buộc KHÔNG ĐẦY ĐỦ. Hơn nữa, bạn nên tạo chỉ mục trên cột số vì cột số có xu hướng có nhiều giá trị duy nhất so với cột không phải số. Thiết kế chỉ mục cơ sở dữ liệu kém sử dụng các chỉ mục trên các cột có rất ít mục nhập duy nhất và có thể dẫn đến các truy vấn rất tốn thời gian.
Hãy xem xét một bảng có tên Bệnh nhân chứa hàng trăm nghìn bản ghi. Bảng Bệnh nhân sẽ chứa một cột có tên là “Giới tính” chỉ có thể có hai giá trị duy nhất là “Nam” và “Nữ”. Nếu bạn tạo chỉ mục trên “Cột Giới tính”, các bản ghi sẽ được sắp xếp theo thứ tự bảng chữ cái tăng dần hoặc giảm dần.
Vì vậy, nếu bạn có một triệu bản ghi trong bảng Bệnh nhân và số lượng bệnh nhân nam và nữ bằng nhau, trong chỉ mục này, nửa triệu bản ghi đầu tiên sẽ có giới tính là “Nữ” và nửa triệu thứ hai sẽ có giới tính là “Nam”. Bây giờ nếu bạn muốn tìm kiếm một cái tồn tại ở hàng thứ 490,000 của các bản ghi cái, SQL Server Engine sẽ phải quét qua 490,000 bản ghi. Mặt khác, với các giá trị số duy nhất, việc tìm kiếm có thể cực kỳ nhanh chóng vì các chỉ mục của SQL Server được lưu trữ dưới dạng B + Cây và do đó, các giá trị số trong các nút cây có thể tăng tốc hoạt động cơ sở dữ liệu.
3. Số chỉ mục
Chính thức, bạn có thể tạo một chỉ mục theo nhóm và bao nhiêu chỉ mục không theo nhóm tùy thích cho mỗi bảng cơ sở dữ liệu. Tuy nhiên, thiết kế chỉ mục cơ sở dữ liệu tốt là tạo ra một chỉ mục được phân cụm và chỉ một số lượng hạn chế các chỉ mục không phân cụm thực sự cần thiết. Việc tạo quá nhiều chỉ mục không phân cụm có thể thực sự làm chậm hoạt động Cập nhật và Chèn vì khi bản ghi được cập nhật hoặc chèn và giá trị cột bị thay đổi, tất cả các chỉ mục liên quan phải được cập nhật.
Hãy xem xét một tình huống trong đó chúng ta có hai chỉ mục không phân cụm, chỉ mục đầu tiên sắp xếp các bản ghi theo độ tuổi và chỉ mục thứ hai sắp xếp các bản ghi theo cả giới tính và độ tuổi.
Đây là chỉ mục đầu tiên:
Tuổi | Ghi địa chỉ |
10 | Ghi lại địa chỉ |
22 | Ghi lại địa chỉ |
29 | Ghi lại địa chỉ |
32 | Ghi lại địa chỉ |
33 | Ghi lại địa chỉ |
36 | Ghi lại địa chỉ |
40 | Ghi lại địa chỉ |
49 | Ghi lại địa chỉ |
54 | Ghi lại địa chỉ |
59 | Ghi lại địa chỉ |
Và đây là thứ hai:
Giới tính | Tuổi | Địa chỉ Ghi |
Nữ | 10 | Ghi lại địa chỉ |
Nữ | 29 | Ghi lại địa chỉ |
Nữ | 33 | Ghi lại địa chỉ |
Nữ | 40 | Ghi lại địa chỉ |
Nữ | 54 | Ghi lại địa chỉ |
Nam | 22 | Ghi lại địa chỉ |
Nam | 32 | Ghi lại địa chỉ |
Nam | 36 | Ghi lại địa chỉ |
Nam | 49 | Ghi lại địa chỉ |
Nam | 59 | Ghi lại địa chỉ |
Bây giờ nếu một bản ghi có tuổi 40 phải được cập nhật thành 15 tuổi vì lý do nào đó, thì chỉ mục đầu tiên sẽ phải được cập nhật để di chuyển bản ghi từ vị trí thứ 7 (40) sang vị trí thứ hai để giữ cho chỉ mục được sắp xếp. Tương tự trong chỉ mục thứ hai, bản ghi trong chỉ mục thứ 4 sẽ được chuyển sang chỉ mục thứ hai. Rất nhiều cuộc cải tổ đã phải diễn ra. Do đó, điều khôn ngoan là nên giữ số lượng chỉ mục ở mức tối thiểu cho các cột được cập nhật thường xuyên khi nghĩ về thiết kế chỉ mục cơ sở dữ liệu. Cũng không nên sử dụng một cột trong nhiều chỉ mục không phân cụm.
4. Vị trí lưu trữ của các chỉ mục
Vị trí lưu trữ của chỉ mục có thể ảnh hưởng đến hiệu suất của các truy vấn sử dụng chỉ mục và do đó cũng là một phần của thiết kế chỉ mục cơ sở dữ liệu tốt. Theo mặc định, một chỉ mục nhóm được lưu trữ trong cùng một nhóm tệp với bảng mà chỉ mục được tạo trên đó. Đối với các chỉ mục không phân cụm, chỉ mục có thể được lưu trữ trong cùng một nhóm tệp hoặc trong các nhóm tệp khác nhau trải dài trên nhiều ổ đĩa. Hiệu suất truy vấn của các chỉ mục không phân cụm có thể được cải thiện đáng kể bằng cách lưu trữ các chỉ mục không phân cụm trên nhiều ổ đĩa. Điều này là do hiệu suất đầu vào / đầu ra của truy vấn sẽ được cải thiện do dữ liệu được phân phối trên các khu vực khác nhau của ổ đĩa.
Vị trí lưu trữ mặc định của các chỉ mục cũng có thể được thay đổi bằng cách chỉ định một giá trị cho tùy chọn FILLFACTOR. Vì, các chỉ mục được lưu trữ vật lý dưới dạng B + Cây, dữ liệu chỉ mục được lưu trữ trên các trang lá. Với tùy chọn FILLFACTOR, bạn có thể đặt tỷ lệ phần trăm của các trang cấp độ lá sẽ được lấp đầy. Ví dụ:nếu bạn đặt giá trị của FILLFACTOR thành 70%, chỉ 70% tổng không gian của trang cấp độ lá sẽ được lấp đầy bởi dữ liệu chỉ mục. 30% còn lại sẽ được để lại để tự động tăng trưởng dữ liệu chỉ mục trong tương lai.
5. Các loại chỉ mục
Một xem xét cực kỳ quan trọng khác trong thiết kế chỉ mục cơ sở dữ liệu là loại chỉ mục sẽ sử dụng. Trong một bài viết trước đó (thêm liên kết đến bài viết “Khi nào sử dụng Chỉ mục được phân cụm hoặc không được phân cụm”), tôi đã giải thích sự khác biệt giữa chỉ mục được phân nhóm và không được phân cụm. Tôi cũng giải thích chúng là gì và cách chúng có thể được sử dụng. Quyết định chọn một chỉ mục được phân nhóm hay không được phân nhóm là rất quan trọng và cần được suy nghĩ cẩn thận.
Cần lưu ý những điểm sau khi quyết định chọn loại chỉ mục nào.
- Đối với các cột được sử dụng trong truy vấn SELECT / JOIN / GROUP BY / BETWEEN, hãy sử dụng các chỉ mục được phân nhóm.
- Sử dụng các chỉ mục không phân cụm cho các cột mà bạn chỉ muốn truy xuất các giá trị từ cột cụ thể đó chứ không phải từ các cột khác của cùng một hàng. Truy vấn SELECT truy xuất nhiều bản ghi bằng cách sử dụng chỉ mục không phân cụm có thể chậm vì công cụ SQL Server trước tiên tìm kiếm các giá trị cột mà chỉ mục được tạo và sau đó sử dụng tham chiếu hàng cho giá trị cột, các bản ghi từ bảng cơ sở dữ liệu thực tế được truy xuất .
- Đối với các cột thường trải qua các thao tác CHÈN và CẬP NHẬT, hãy sử dụng chỉ mục không phân cụm. Đảm bảo không sử dụng một cột trong nhiều chỉ mục không phân cụm vì điều đó có thể làm chậm các truy vấn cập nhật. Các chỉ mục được phân cụm có thể chậm đối với các thao tác CHÈN / CẬP NHẬT vì hàng hoàn chỉnh phải được cập nhật thay vì chỉ một giá trị cột đơn lẻ như trường hợp của các chỉ mục không được phân cụm.
- Vì bạn chỉ có thể tạo một chỉ mục được phân nhóm nên trong trường hợp bạn cần nhiều chỉ mục, hãy sử dụng các chỉ mục không được phân cụm. Tuy nhiên, nếu dung lượng ổ đĩa là mối quan tâm lớn, hãy giữ số lượng chỉ mục không phân cụm ở mức tối thiểu.
Các cân nhắc khác
Mặc dù đây là năm phần quan trọng nhất của thiết kế chỉ mục cơ sở dữ liệu nhưng chúng không phải là tất cả. Điều quan trọng là chỉ định đúng thứ tự của các cột trong chỉ mục. Theo quy tắc chung, các cột được sử dụng để ra quyết định trong mệnh đề WHERE và các điều kiện như lớn hơn (>), nhỏ hơn (<), v.v., nên được đặt trước các cột không liên quan đến các mệnh đề này. Trong trường hợp có nhiều cột trong mệnh đề WHERE, các tên cột đặc biệt nhất nên được đề cập sớm nhất trong định nghĩa Chỉ mục.
Ngoài thiết kế chỉ mục cơ sở dữ liệu, thiết kế truy vấn cũng đóng một vai trò quan trọng trong việc sử dụng hiệu quả thiết kế chỉ mục. Để duy trì chỉ mục được tối ưu hóa thay vì viết nhiều truy vấn hoạt động trên một số lượng nhỏ hàng, hãy cố gắng viết ít truy vấn hơn ảnh hưởng đến số lượng hàng lớn hơn trong bảng.
Kết luận
Bài viết này giải thích một số cân nhắc chính mà một nhà phát triển cơ sở dữ liệu phải tính đến khi xem xét thiết kế chỉ mục cơ sở dữ liệu. Bài viết cũng giải thích lý do đằng sau những cân nhắc này và chứa các đề xuất khác để đảm bảo rằng thiết kế chỉ mục cơ sở dữ liệu của bạn hiệu quả.