Các chỉ mục rất quan trọng trong bất kỳ cơ sở dữ liệu nào và với MongoDB thì điều đó cũng không khác. Với việc sử dụng Chỉ mục, việc thực hiện các truy vấn trong MongoDB trở nên hiệu quả hơn
Nếu bạn có một bộ sưu tập với hàng nghìn tài liệu không có chỉ mục và sau đó bạn truy vấn để tìm một số tài liệu nhất định, thì trong trường hợp đó, MongoDB sẽ cần quét toàn bộ bộ sưu tập để tìm tài liệu. Nhưng nếu bạn có các chỉ mục, MongoDB sẽ sử dụng các chỉ mục này để giới hạn số lượng tài liệu phải được tìm kiếm trong bộ sưu tập
Chỉ mục là tập dữ liệu đặc biệt lưu trữ một phần dữ liệu của tập hợp. Vì dữ liệu là một phần nên việc đọc dữ liệu này trở nên dễ dàng hơn. Bộ một phần này lưu trữ giá trị của một trường cụ thể hoặc một tập hợp các trường được sắp xếp theo giá trị của trường
Trong hướng dẫn này, bạn sẽ học –
Hiểu tác động của các chỉ mục
Bây giờ, mặc dù từ phần giới thiệu, chúng ta đã thấy rằng các chỉ mục rất tốt cho các truy vấn, nhưng có quá nhiều chỉ mục có thể làm chậm các hoạt động khác, chẳng hạn như thao tác Chèn, Xóa và Cập nhật
Nếu thường xuyên có các thao tác chèn, xóa và cập nhật được thực hiện trên tài liệu, thì các chỉ mục sẽ cần phải thay đổi hoạt động đó thường xuyên, đây sẽ chỉ là chi phí chung cho bộ sưu tập
Ví dụ dưới đây cho thấy một ví dụ về những giá trị trường nào có thể tạo thành một chỉ mục trong một bộ sưu tập. Chỉ mục có thể dựa trên chỉ một trường trong tập hợp hoặc có thể dựa trên nhiều trường trong tập hợp
Trong ví dụ bên dưới, Mã nhân viên “1” và Mã nhân viên “AA” được sử dụng để lập chỉ mục các tài liệu trong bộ sưu tập. Vì vậy, khi tìm kiếm truy vấn được thực hiện, các chỉ mục này sẽ được sử dụng để tìm các tài liệu cần thiết trong bộ sưu tập một cách nhanh chóng và hiệu quả
Vì vậy, ngay cả khi truy vấn tìm kiếm dựa trên Mã nhân viên “AA”, tài liệu đó sẽ được trả về
Cách tạo chỉ mục. tạo Index[]
Tạo một Index trong MongoDB được thực hiện bằng cách sử dụng phương thức “createIndex”
Ví dụ sau đây cho thấy cách thêm chỉ mục vào bộ sưu tập. Giả sử rằng chúng ta có cùng một bộ sưu tập Nhân viên có tên Trường là “Employeeid” và “EmployeeName”
db.Employee.createIndex[{Employeeid:1}]
Giải thích mã
- Phương thức createIndex được sử dụng để tạo một chỉ mục dựa trên “Employeeid” của tài liệu
- Tham số '1' chỉ ra rằng khi chỉ mục được tạo với các giá trị Trường "Employeeid", chúng phải được sắp xếp theo thứ tự tăng dần. Xin lưu ý rằng điều này khác với trường _id [Trường id được sử dụng để xác định duy nhất từng tài liệu trong bộ sưu tập] được tạo tự động trong bộ sưu tập bởi MongoDB. Các tài liệu bây giờ sẽ được sắp xếp theo tên nhân viên chứ không phải trường _id
Nếu lệnh được thực hiện thành công, Kết quả sau sẽ được hiển thị
đầu ra
- numIndexes Before. 1 cho biết số lượng giá trị Trường [Các trường thực tế trong bộ sưu tập] đã có trong các chỉ mục trước khi lệnh được chạy. Hãy nhớ rằng mỗi bộ sưu tập có trường _id cũng được tính là giá trị Trường cho chỉ mục. Vì trường chỉ mục _id là một phần của tập hợp khi nó được tạo lần đầu, nên giá trị của numIndexesB Before là 1
- numIndexesSau. 2 cho biết số lượng giá trị Trường có trong chỉ mục sau khi lệnh được chạy
- Đây là “được rồi. 1” xác định rằng thao tác đã thành công và chỉ mục mới được thêm vào bộ sưu tập
Đoạn mã trên cho biết cách tạo chỉ mục dựa trên một giá trị trường, nhưng người ta cũng có thể tạo chỉ mục dựa trên nhiều giá trị trường
Lập chỉ mục là một khái niệm quan trọng trong thế giới cơ sở dữ liệu. Ưu điểm chính của việc tạo chỉ mục trên bất kỳ trường nào là truy cập dữ liệu nhanh hơn. Nó tối ưu hóa quá trình tìm kiếm và truy cập cơ sở dữ liệu. Hãy xem xét ví dụ này để hiểu điều này
Khi bất kỳ người dùng nào yêu cầu một hàng cụ thể từ cơ sở dữ liệu, hệ thống DB sẽ làm gì?
Nói chung, khi bạn xác định một chỉ mục trên một trường cụ thể, hệ thống DB sẽ tạo một danh sách theo thứ tự giá trị của trường đó và lưu trữ nó trong một bảng khác. Mỗi mục của bảng này sẽ trỏ đến các giá trị tương ứng trong bảng gốc. Vì vậy, khi người dùng cố gắng tìm kiếm bất kỳ hàng nào, trước tiên, nó sẽ tìm kiếm giá trị trong bảng chỉ mục bằng thuật toán tìm kiếm nhị phân và trả về giá trị tương ứng từ bảng gốc. Quá trình này sẽ mất ít thời gian hơn vì chúng tôi đang sử dụng tìm kiếm nhị phân thay vì tìm kiếm tuyến tính
Trong bài viết này, chúng tôi sẽ tập trung vào Lập chỉ mục MongoDB và hiểu cách tạo và sử dụng các chỉ mục trong MongoDB
Làm cách nào để tạo một chỉ mục trong Bộ sưu tập MongoDB?
Để tạo chỉ mục bằng Mongo shell, bạn có thể sử dụng cú pháp này
db.collection.createIndex[ , ]
Thí dụ
Để tạo chỉ mục trên trường tên trong bộ sưu tập myColl .
db.myColl.createIndex[ { name: -1 } ]
Các loại chỉ mục MongoDB
Chỉ mục _id mặc định
Đây là chỉ mục mặc định sẽ được tạo bởi MongoDB khi bạn tạo một bộ sưu tập mới. Nếu bạn không chỉ định bất kỳ giá trị nào cho trường này thì _id sẽ là khóa chính theo mặc định cho bộ sưu tập của bạn để người dùng không thể chèn hai tài liệu có cùng giá trị trường _id. Bạn không thể xóa chỉ mục này khỏi trường _id
Chỉ mục trường đơn
Bạn có thể sử dụng loại chỉ mục này khi muốn tạo chỉ mục mới trên bất kỳ trường nào ngoài trường _id
Thí dụ
db.myColl.createIndex[ { name: 1 } ]
Thao tác này sẽ tạo một chỉ mục khóa tăng dần duy nhất trên trường tên trong myColl collection
chỉ số hợp chất
Bạn cũng có thể tạo chỉ mục trên nhiều trường bằng chỉ mục Hợp chất. Đối với chỉ mục này, thứ tự của các trường mà chúng được xác định trong chỉ mục quan trọng. Hãy xem xét ví dụ này
db.myColl.createIndex[{ name: 1, score: -1 }]
Chỉ mục này trước tiên sẽ sắp xếp bộ sưu tập theo tên theo thứ tự tăng dần và sau đó đối với mỗi giá trị tên, nó sẽ sắp xếp theo giá trị điểm theo thứ tự giảm dần
Chỉ mục đa phím
Chỉ mục này có thể được sử dụng để lập chỉ mục dữ liệu mảng. Nếu bất kỳ trường nào trong bộ sưu tập có một mảng làm giá trị của nó thì bạn có thể sử dụng chỉ mục này để tạo các mục nhập chỉ mục riêng cho từng phần tử trong mảng. Nếu trường được lập chỉ mục là một mảng, thì MongoDB sẽ tự động tạo chỉ mục Multikey trên đó
Hãy xem xét ví dụ này
{ ‘userid’: 1, ‘name’: ‘mongo’, ‘addr’: [ {zip: 12345, ...}, {zip: 34567, ...} ] }
Bạn có thể tạo chỉ mục Đa khóa trên trường addr bằng cách đưa ra lệnh này trong Mongo shell.
db.myColl.createIndex[{ addr.zip: 1 }]
chỉ mục không gian địa lý
Giả sử bạn đã lưu trữ một số tọa độ trong bộ sưu tập MongoDB. Để tạo chỉ mục trên các trường loại này [có dữ liệu không gian địa lý], bạn có thể sử dụng chỉ mục Không gian địa lý. MongoDB hỗ trợ hai loại chỉ mục không gian địa lý
chỉ mục 2d. Bạn có thể sử dụng chỉ mục này cho dữ liệu được lưu trữ dưới dạng điểm trên mặt phẳng 2D
db.collection.createIndex[ { : "2d" } ]
Chỉ mục 2dsphere. Sử dụng chỉ mục này khi dữ liệu của bạn được lưu trữ ở định dạng GeoJson hoặc các cặp tọa độ [kinh độ, vĩ độ]
Mục lục văn bản
Để hỗ trợ các truy vấn bao gồm tìm kiếm một số văn bản trong bộ sưu tập, bạn có thể sử dụng Chỉ mục văn bản
Thí dụ
db.myColl.createIndex[ { address: "text" } ]
Chỉ số băm
MongoDB hỗ trợ sharding dựa trên hàm băm. Chỉ mục được băm tính toán hàm băm của các giá trị của trường được lập chỉ mục. Chỉ mục được băm hỗ trợ phân đoạn bằng cách sử dụng các khóa được phân đoạn được băm. Hashed sharding sử dụng chỉ mục này làm khóa phân đoạn để phân vùng dữ liệu trên cụm của bạn
Thí dụ
db.myColl.createIndex[ { _id: "hashed" } ]
Thuộc tính của chỉ mục
Chỉ mục duy nhất
Thuộc tính này đảm bảo rằng không có giá trị trùng lặp trong trường được lập chỉ mục. Nếu tìm thấy bất kỳ mục trùng lặp nào trong khi tạo chỉ mục, thì nó sẽ loại bỏ các mục đó
Chỉ mục thưa thớt
Thuộc tính này đảm bảo rằng tất cả các truy vấn tìm kiếm tài liệu với trường được lập chỉ mục. Nếu bất kỳ tài liệu nào không có trường được lập chỉ mục thì nó sẽ bị loại khỏi tập kết quả
Chỉ số TTL
Chỉ mục này được sử dụng để tự động xóa tài liệu khỏi bộ sưu tập sau khoảng thời gian cụ thể [TTL]. Điều này lý tưởng để xóa tài liệu về nhật ký sự kiện hoặc phiên người dùng
Phân tích hiệu suất
Xem xét một tập hợp các điểm số của sinh viên. Nó có chính xác 3000000 tài liệu trong đó. Chúng tôi chưa tạo bất kỳ chỉ mục nào trong bộ sưu tập này. Xem hình ảnh dưới đây để hiểu lược đồ
Văn bản mẫu trong bộ sưu tập điểm
Bây giờ, hãy xem xét truy vấn này mà không có bất kỳ chỉ mục nào
db.myColl.createIndex[ { name: -1 } ]
0Truy vấn này mất 1155 mili giây để thực hiện. Đây là đầu ra. Tìm kiếm trường executionTimeMillis để biết kết quả.
Thời gian thực hiện mà không cần lập chỉ mục
Bây giờ hãy tạo chỉ mục trên trường sinh viên. Để tạo chỉ mục chạy truy vấn này
db.myColl.createIndex[ { name: -1 } ]
1Bây giờ cùng một truy vấn mất 0ms
Thời gian thực hiện với lập chỉ mục
Bạn có thể thấy rõ sự khác biệt về thời gian thực hiện. Nó gần như ngay lập tức. Đó là sức mạnh của việc lập chỉ mục
Phần kết luận
Một điều rõ ràng là. Tạo chỉ mục. Dựa trên các truy vấn của bạn, bạn có thể xác định các loại chỉ mục khác nhau trên bộ sưu tập của mình. Nếu bạn không tạo chỉ mục, thì mỗi truy vấn sẽ quét toàn bộ bộ sưu tập, điều này sẽ mất rất nhiều thời gian khiến ứng dụng của bạn rất chậm và nó sử dụng nhiều tài nguyên của máy chủ của bạn. Mặt khác, đừng tạo quá nhiều chỉ mục vì việc tạo các chỉ mục không cần thiết sẽ gây thêm thời gian cho tất cả các thao tác chèn, xóa và cập nhật. Khi bạn thực hiện bất kỳ thao tác nào trong số này trên một trường được lập chỉ mục, thì bạn cũng phải thực hiện thao tác tương tự trên cây chỉ mục, điều này sẽ mất thời gian. Các chỉ mục được lưu trữ trong RAM nên việc tạo các chỉ mục không liên quan có thể ngốn dung lượng RAM của bạn và làm chậm máy chủ của bạn