MongoDB có tự động tạo chỉ mục không?

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ề

MongoDB có tự động tạo chỉ mục không?

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”

MongoDB có tự động tạo chỉ mục không?

db.Employee.createIndex({Employeeid:1})

Giải thích mã

  1. 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
  2. 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

MongoDB có tự động tạo chỉ mục không?

  1. 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
  2. numIndexesSau. 2 cho biết số lượng giá trị Trường có trong chỉ mục sau khi lệnh được chạy
  3. Đâ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

  1. 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

  2. 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

  3. 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

  4. 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 })
  5. 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ĩ độ)

    ________số 8_______
  6. 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" } )
  7. 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

  1. 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 đó

  2. 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ả

  3. 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 đồ

MongoDB có tự động tạo chỉ mục không?

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 } )
0

Truy 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ả.

MongoDB có tự động tạo chỉ mục không?

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 } )
1

Bây giờ cùng một truy vấn mất 0ms

MongoDB có tự động tạo chỉ mục không?

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

Làm thế nào các chỉ mục được tạo trong MongoDB?

Để tạo chỉ mục trong Mongo Shell, hãy sử dụng db. thu thập. createIndex() . db. thu thập. Phương thức createIndex() chỉ tạo một chỉ mục nếu một chỉ mục của cùng một đặc điểm kỹ thuật chưa tồn tại. Các chỉ mục MongoDB sử dụng cấu trúc dữ liệu B-tree.

Trường nào được MongoDB tự động tạo?

Về mặt kiến ​​trúc, theo mặc định, trường _id là một ObjectID, một trong các loại BSON của MongoDB. ObjectID là khóa chính cho tài liệu được lưu trữ và được tạo tự động khi tạo tài liệu mới trong bộ sưu tập.

MongoDB quyết định sử dụng chỉ mục nào như thế nào?

Thực tế, cách để xác định chỉ mục nào sẽ được sử dụng là tạo một kế hoạch truy vấn cho truy vấn tìm bằng cách sử dụng phương pháp giải thích() . Bạn có thể phân tích kế hoạch và tìm ra chỉ mục nào được sử dụng, cách thức và xem số liệu thống kê như mất bao nhiêu thời gian để thực hiện truy vấn. Xem Phân tích hiệu suất truy vấn để biết chi tiết.