MongoEngine là một Object Document Mapper (ODM) để làm việc với MongoDB từ Python. Lớp ODM ánh xạ mô hình đối tượng tới cơ sở dữ liệu tài liệu theo cách tương tự như ORM ánh xạ mô hình đối tượng với cơ sở dữ liệu quan hệ. ODM như MongoEngine cung cấp các tính năng giống như cơ sở dữ liệu quan hệ, ví dụ:thực thi lược đồ, khóa ngoại, ràng buộc cấp trường, v.v. ở cấp ứng dụng.
Nhiều tài nguyên tốt có sẵn để học cách sử dụng MongoEngine, bao gồm cả hướng dẫn tại đây.
Trong bài đăng này, chúng ta sẽ thảo luận về cấu trúc lập trình MongoEngine để tạo chỉ mục dưới dạng hướng dẫn python MongoDB và chi phí hiệu suất liên quan đến nó.
Tạo chỉ mục tự động trong MongoEngine
Theo mặc định, MongoEngine lưu trữ các tài liệu trong một tập hợp được đặt tên là dạng đa nguyên của tên lớp. Ví dụ:lớp Người dùng được hiển thị bên dưới sẽ được lưu trữ trong một tập hợp có tên là người dùng. Một mô hình nên kế thừa Tài liệu lớp MongoEngine để trở thành một đối tượng được ánh xạ.
Người dùngclass User(Document): meta = { 'indexes': [ { 'fields': ['+name'] }, { 'fields': ['#email'] }] }
Lớp Người dùng được định nghĩa ở trên khai báo hai chỉ mục:1. tên (thứ tự sắp xếp) và 2. email (được băm). MongoEngine tạo từng chỉ mục được khai báo ở thao tác upert đầu tiên. Các chỉ mục này được tạo trên bộ sưu tập thông qua lệnh gọi createIndex / ensureIndex. MongoEngine cố gắng tạo các chỉ mục này mỗi khi tài liệu được chèn vào bộ sưu tập.
Ví dụ:
User(name = "Ross", email='[email protected]",address="127,Baker Street").save()
Cuộc gọi này dẫn đến ba yêu cầu lệnh tới máy chủ cơ sở dữ liệu: hai các lệnh để đảm bảo rằng tên và chỉ mục email tồn tại trên bộ sưu tập người dùng, một để thực hiện việc nâng cấp thực tế.
COMMAND [conn8640] command admin.$cmd command: createIndexes { createIndexes: "user", indexes: [ { background: false, name: "name_1", key: { name: 1 } } ] } keyUpdates:0 writeConflicts:0 numYields:0 reslen:149 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { W: 1 } } } protocol:op_query 0ms COMMAND [conn8640] command admin.$cmd command: createIndexes { createIndexes: "user", indexes: [ { background: false, name: "email_hashed", key: { email: "hashed" } } ] } keyUpdates:0 writeConflicts:0 numYields:0 reslen:149 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { W: 1 } } } protocol:op_query 0ms COMMAND [conn8640] command admin.user command: insert { insert: "user", ordered: true, documents: [ { name: "Ross", email: "[email protected]", address: "127, Baker Street", _id: ObjectId('584419df01f38269dd9d63c1') } ], writeConcern: { w: 1 } } ninserted:1 keyUpdates:0 writeConflicts:0 numYields:0 reslen:40 locks:{ Global: { acquireCount: { r: 1, w: 1 } }, Database: { acquireCount: { W: 1 } }, Collection: { acquireCount: { w: 1 } } } protocol:op_query 0ms
Điều này là ok cho các ứng dụng có tải ghi từ thấp đến trung bình. Tuy nhiên, nếu ứng dụng của bạn sử dụng nhiều viết, điều này có tác động tiêu cực nghiêm trọng đến hiệu suất ghi.
Tránh tạo chỉ mục tự động
Nếu 'auto_create_index' được đặt thành false trong siêu từ điển, thì MongoEngine bỏ qua việc tạo chỉ mục tự động. Không có yêu cầu createIndex bổ sung nào được gửi trong các hoạt động ghi. Tắt Tạo chỉ mục tự động cũng hữu ích trong các hệ thống sản xuất mà chỉ mục thường được áp dụng trong quá trình triển khai cơ sở dữ liệu.
Ví dụ:
meta = { 'auto_create_index':false, 'indexes': [ ..... ] }
Trong trường hợp bạn đang thiết kế một ứng dụng cần nhiều khả năng viết, bạn nên quyết định các chỉ mục của mình trong giai đoạn thiết kế lược đồ và triển khai chúng ngay cả trước khi ứng dụng được triển khai. Nếu bạn đang có kế hoạch thêm chỉ mục vào các bộ sưu tập hiện có, tốt hơn là bạn nên làm theo tài liệu để xây dựng chỉ mục trên tập hợp bản sao. Bằng cách sử dụng phương pháp này, chúng tôi hạ từng máy chủ xuống và xây dựng chỉ mục trên chúng.
Sử dụng phương thức create_index của MongoEngine để tạo chỉ mục trong ứng dụng:
User.create_index(keys, background=False, **kwargs)
Bạn cũng có thể sử dụng giao diện người dùng ScaleGrid để giúp bạn xây dựng các chỉ mục theo 'kiểu cuộn' mà không cần thời gian chết. Để biết thêm chi tiết, hãy tham khảo bài đăng trên blog xây dựng chỉ mục MongoDB của chúng tôi.