MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Tổng quan về Lập chỉ mục cơ sở dữ liệu cho MongoDB

Lập chỉ mục là gì?

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ó sẽ bắt đầu từ hàng đầu tiên và kiểm tra xem đây có phải là hàng mà người dùng muốn không? Nếu có, hãy trả lại hàng đó, nếu không, hãy tiếp tục tìm kiếm hàng đó cho đến hết.

Nói chung, khi bạn xác định chỉ mục trên một trường cụ thể, hệ thống DB sẽ tạo một danh sách có thứ tự giá trị của trường đó và lưu trữ nó trong một bảng khác. Mỗi mục nhập 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, đầu 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.

Cách tạo chỉ mục trong MongoDB Collection?

Để tạo chỉ mục bằng Mongo shell, bạn có thể sử dụng cú pháp sau:

db.collection.createIndex( <key and index type specification>, <options> )

Ví 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 khác ngoài trường _id.

    Ví dụ:

    db.myColl.createIndex( { name: 1 } )

    Thao tác này sẽ tạo chỉ mục tăng dần một khóa duy nhất trên trường tên trong bộ sưu tập myColl

  3. Chỉ mục tổng hợp

    Bạn cũng có thể tạo chỉ mục trên nhiều trường bằng cách sử dụng Chỉ mục kết hợp. Đố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 rất 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 các giá trị điểm theo thứ tự giảm dần.

  4. Chỉ mục đa khóa

    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 tập hợp có một mảng là 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 biệt 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 Multikey trên trường addr bằng cách sử dụng 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( { <location field> : "2d" } )
    • 2dsphere Index:Sử dụng chỉ mục này khi dữ liệu của bạn được lưu trữ dưới dạng GeoJson hoặc các cặp tọa độ (kinh độ, vĩ độ)

    db.collection.createIndex( { <location field> : "2dsphere" } )
  6. Chỉ mụ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.

    Ví dụ:

    db.myColl.createIndex( { address: "text" } )
  7. Chỉ mục băm

    MongoDB hỗ trợ sharding dựa trên băm. Chỉ mục băm tính toán băm của các giá trị của trường được lập chỉ mục. Chỉ mục băm hỗ trợ phân đoạn sắc nét bằng cách sử dụng các khóa được băm nhỏ. Mập băm 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 toàn bộ cụm của bạn.

    Ví 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ỳ bản sao nào trong khi tạo chỉ mục, thì nó sẽ loại bỏ các mục nhập đó.

  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ì tài liệu đó sẽ bị loại bỏ khỏi tập kết quả.

  3. Chỉ mục 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 của 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 học sinh. 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 này bên dưới để hiểu lược đồ.

Các tài liệu 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.scores.find({ student: 585534 }).explain("executionStats")

Truy vấn này mất 1155ms để thực thi. Đây là kết quả đầu ra. Tìm kiếm trường executeTimeMillis cho kết quả.

Thời gian thực thi mà không lập chỉ mục

Bây giờ chúng ta hãy tạo chỉ mục trên trường sinh viên. Để tạo chỉ mục, hãy chạy truy vấn này.

db.scores.createIndex({ student: 1 })

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

Thời gian thực thi 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 lập chỉ mục.

Kết luận

Một bài học rõ ràng là:Tạo chỉ mục. Dựa trên các truy vấn của mình, 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 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 chỉ mục không cần thiết sẽ gây tốn 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ể chiếm dung lượng RAM và làm chậm máy chủ của bạn.


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. sắp xếp tổng hợp mongodb

  2. Hoàn thiện nghệ thuật tự động hóa &quản lý cơ sở dữ liệu nguồn mở phổ biến nhất:2017 @ Somenines

  3. MongoDB .NET không tạo _id khi upert

  4. Cập nhật đường dẫn 'x' sẽ tạo ra xung đột tại 'x'

  5. Các cụm MongoDB hiệu suất cao trên Azure