Bài trước: MongoDB (5) - Thao tác tài liệu
Tài liệu tham khảo: Sổ tay MongoDB
1. Khái niệm cơ bản về chỉ mục
Chỉ mục giúp MongoDB thực hiện truy vấn hiệu quả. Khi không có chỉ mục, MongoDB phải quét toàn bộ tập hợp để tìm tài liệu phù hợp. Nếu có chỉ mục phù hợp, MongoDB chỉ cần kiểm tra một phần nhỏ các tài liệu.
Chỉ mục là cấu trúc dữ liệu đặc biệt lưu trữ một phần nhỏ dữ liệu của tập hợp, được sắp xếp theo thứ tự dễ dàng duyệt. Chỉ mục hỗ trợ truy vấn so sánh bằng và phạm vi, đồng thời trả về kết quả đã sắp xếp nhờ thứ tự trong chỉ mục.
Khi tạo tài liệu, MongoDB tự động thêm trường _id với chỉ mục duy nhất để tránh trùng lặp. MongoDB sử dụng cấu trúc dữ liệu B-Cây cho chỉ mục, khác với B+Cây trong MySQL.
MongoDB sử dụng cấu trúc dữ liệu B-Cây cho chỉ mục, trong khi MySQL sử dụng B+Cây
2. Tạo chỉ mục
Cú pháp: db.tập_hợp.tạoChỉMục(keys, tùy_chọn)
Các tùy chọn có thể sử dụng:
| **Tham số** | **Kiểu** | **Mô tả** |
|---|---|---|
| background | Boolean | Tạo chỉ mục ở chế độ nền để tránh chặn các thao tác khác. Mặc định là **false**. |
| duy_nhất | Boolean | Tạo chỉ mục duy nhất. Mặc định là **false**. |
| tên | string | Tên chỉ mục. Nếu không cung cấp, MongoDB sẽ tự động tạo tên từ trường và thứ tự sắp xếp. |
| sparse | Boolean | Bỏ qua các tài liệu không có trường này. Mặc định là **false**. |
| hết_hạn_sau | số nguyên | Thiết lập thời gian sống cho chỉ mục tính bằng giây. |
| trọng_số | tài_liệu | Điểm trọng số cho các trường trong chỉ mục (1-99,999). |
| ngôn_ngữ_mặc_định | string | Ngôn ngữ cho chỉ mục văn bản, mặc định là tiếng Anh. |
3. Phân loại chỉ mục
3.1 Chỉ mục đơn trường
Tạo chỉ mục cho một trường cụ thể.
Cú pháp: db.tập_hợp.tạoChỉMục({trường:1}) // 1 là tăng dần, -1 là giảm dần
3.2 Chỉ mục phức hợp
Tạo chỉ mục cho nhiều trường cùng lúc.
Cú pháp: db.tập_hợp.đảm_đáoChỉMục({trường1:1, trường2:-1}) // Tạo chỉ mục cho trường1 và trường2
3.3 Chỉ mục duy nhất
Đảm bảo giá trị trường trong tài liệu là duy nhất.
Cú pháp: db.tập_hợp.đảm_đáoChỉMục({trường:1}, {duy_nhất: true})
3.4 Chỉ mục hết hạn
Xóa dữ liệu khi chỉ mục hết hiệu lực.
Cú pháp: db.tập_hợp.đảm_đáoChỉMục({thời_gian:1}, {hết_hạn_sau: 30}) // Hết hạn sau 30 giây
Giá trị thời_gian phải là kiểu ISODate, nếu không dữ liệu sẽ không bị xóa.
3.5 Chỉ mục không gian địa lý
3.5.1 Chỉ mục 2D
Phù hợp cho bản đồ phẳng như trò chơi, gây méo mó ở cực nếu dùng cho bề mặt cầu.
3.5.2 Chỉ mục 2Dsphere
Hỗ trợ bản đồ Trái Đất với định dạng GeoJSON (điểm, đường, đa giác).
4. Xem chỉ mục
Hiển thị tất cả chỉ mục trong tập hợp:
Cú pháp: db.tập_hợp.lấyChỉMục()
phiên_bản: phiên bản engine chỉ mục
khóa: trường được chỉ mục
tên: tên chỉ mục (mặc định là tên trường + thứ tự)
không_gian: vị trí chỉ mục (cơ_sở_dữ_liệu.tập_hợp)
5. Xóa chỉ mục
5.1 Xóa chỉ mục cụ thể
Cú pháp: db.tập_hợp.xóaChỉMục(tên_chỉ_mục)
Xóa chỉ mục bằng tên.
5.2 Xóa tất cả chỉ mục
Lưu ý: Chỉ mục _id sẽ không bị xóa.
Cú pháp: db.tập_hợp.xóaTấtCảChỉMục()
6. Kiểm tra hiệu suất chỉ mục
Sử dụng lệnh sau để xác nhận chỉ mục có hoạt động:
db.tập_hợp.tìm(truy_vấn, tùy_chọn).giải_thích(tùy_chọn)
Ví dụ: Kiểm tra chỉ mục trên trường mã_số trong tập hợp sinh_viên:
db.sinh_viên.tìm({mã_số: "123"}).giải_thích()
Nếu kết quả hiển thị LẤY_DỮ LIỆU thì đang dùng chỉ mục. Nếu là QUÉT_TẬP_HỢP thì chưa dùng chỉ mục.
Lưu ý: Nếu trường truy vấn trùng với chỉ mục, MongoDB sẽ lấy dữ liệu trực tiếp từ chỉ mục, không cần truy cập tập hợp.