Database
 sql >> база данни >  >> RDS >> Database

Работа със създаването на индекс с MongoEngine в Python

MongoEngine е обектен Document Mapper (ODM) за работа с MongoDB от Python. ODM слоят съпоставя обектен модел с  база данни с документи по начин, подобен на ORM, съпоставящ обектен модел в релационна база данни. ODM като MongoEngine предлагат функции, подобни на релационна база данни, напр. прилагане на схема, външен ключ, ограничение на ниво поле и т.н. на ниво приложение.

Налични са много добри ресурси за да научите как да използвате MongoEngine, включително урок тук.

В тази публикация ще обсъдим програмна конструкция на MongoEngine за създаване на индекси като урок за MongoDB python и режийните разходи за производителност, свързани с него.

Автоматично създаване на индекс в MongoEngine

По подразбиране MongoEngine съхранява документи в колекция, която е наречена като множествена форма на името на класа. Например, показаният по-долу клас User ще бъде съхранен в колекция с име users. Моделът трябва да наследи MongoEngine клас Document, за да стане съпоставен обект.

class User(Document):
    meta = {        
	'indexes': [
	{
	     'fields': ['+name']	               
	},
	{
	     'fields': ['#email']
	}]             
    }	

Класът User, дефиниран по-горе, декларира два индекса:1. име (ред на сортиране) и 2. имейл (хеширан). MongoEngine създава всеки деклариран индекс при първата операция upsert. Тези индекси се създават в колекцията чрез извикване createIndex/ensureIndex . MongoEngine се опитва да създаде тези индекси всеки път, когато документ се вмъкне в колекцията.
Напр.

User(name = "Ross", email='[email protected]",address="127,Baker Street").save()

Това обаждане води до три командни заявки към сървъра на базата данни:две команди, за да се гарантира, че името и индексът на имейл съществуват в колекцията на потребителите, една за да извършите същинското раздразнение.

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

Това е добре за приложения, при които натоварването при запис е ниско до умерено. Въпреки това, ако приложението ви е с интензивно писане, това има сериозно неблагоприятно въздействие върху производителността на запис.

Избягване на автоматичното създаване на индекс

Ако 'auto_create_index' е зададен на false в мета-речника, тогава MongoEngine пропуска автоматичното създаване на индекси. Не се изпращат допълнителни заявки за createIndex по време на операции по запис. Изключването на автоматичното създаване на индекси е полезно и в производствени системи, където индексите се прилагат обикновено по време на разполагане на база данни.
Например,

meta = {
		'auto_create_index':false,
		'indexes': [
		        .....
        	]
       }

В случай, че проектирате приложение с интензивно писане, има смисъл да вземете решение за вашите индекси по време на фазата на проектиране на схемата и да ги разположите дори преди приложението да бъде разгърнато. Ако планирате да добавяте индекси към съществуващи колекции, би било по-добре да следвате документацията, за да изградите индекс върху набор от реплики. Използвайки този подход,  сваляме сървърите един по един и изграждаме индекси     върху тях.

Използвайте метода MongoEngine create_index за създаване на индекси в приложението:

User.create_index(keys, background=False, **kwargs)

Можете също да използвате потребителския интерфейс на ScaleGrid, за да ви помогне да изградите индекси по „подвижен начин“ без прекъсване. За повече подробности вижте нашата публикация в блога за изграждане на индекси на MongoDB.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Хекатон с обрат:TVP в паметта – част 3

  2. Присъединете се към нас в Лас Вегас за SQLintersection и спестете $100

  3. Проектиране на база данни за регистриране на одит

  4. Използване на Trace Flag 3226 за потискане на регистрирането на архивиране на регистрационни файлове

  5. Използване на Jenkins с Kubernetes AWS, част 3