programing

Pymongo / MongoDB: 인덱스를 생성하거나 인덱스를 보장합니까?

i4 2023. 5. 1. 19:58
반응형

Pymongo / MongoDB: 인덱스를 생성하거나 인덱스를 보장합니까?

사이의 차이를 이해할 수 없습니다.create_index그리고.ensure_index피몽고로MongoDB 인덱스 페이지에 다음과 같이 나와 있습니다.

호출하여 인덱스를 생성할 수 있습니다.ensureIndex()

그러나 pymongo에는 두 개의 서로 다른 명령과 및 인덱스 생성에 대한 설명서가 있습니다.

무조건 인덱스 생성을 시도하는 create_index()와 달리 esture_index()는 드라이버 내의 일부 캐싱을 활용하여 아직 존재하지 않을 수 있는 인덱스 생성만 시도합니다.PyMongo에서 인덱스를 생성(또는 보장)할 때 ttl초 동안 "기억"됩니다.해당 제한 시간 내에 _index()를 확인하기 위해 반복적으로 호출하면 경량이 됩니다. 실제로 인덱스를 생성하려고 하지는 않습니다.

내가 이해한 것이 옳습니까?ensure_index영구 인덱스를 생성하거나 사용해야 합니까?create_index이것 때문에?

@그 점에서 정씨 말이 맞습니다.ensure_index()는 위포지니다입장의▁▁wrapper다▁a 위의 래퍼입니다.create_index()저는 다음과 같은 문구로 혼란이 발생한다고 생각합니다.

PyMongo에서 인덱스를 생성(또는 보장)할 때 ttl초 동안 "기억"됩니다.

인 것이 , 인스가일 "시적인 "초덱아 "이라니 " 것나다 " 지이니 " 정시간 " 된합발 " 안생동 " 음과호 " 다이같출 " 은거적일 " 시초)▁to,라▁is " ▁call▁is,▁it인니일,다"ienttrans▁the▁happens니▁index▁a▁temporary▁during "로 전화가 걸려옵니다.ensure_index()동일한 인덱스를 다시 생성하려고 하면 아무런 효과가 없고 호출되지 않습니다.create_index()그 "가 만료된 후에, "캐시" "캐시" "캐시", "캐시" 에 대한 합니다.ensure_index() 다시 방문할 입니다.create_index()밑에

솔직히 PyMongo의 문서는 이것이 어떻게 작동하는지 설명하는 것을 잘 하지 못하기 때문에 저는 당신의 혼란을 완벽하게 이해합니다. 하지만 Ruby 문서로 넘어가면 설명이 조금 더 명확합니다.

  • (문자열) esture_index(규격, 옵션 = {})

create_index를 호출하고 X분 동안 다시 그러지 않도록 플래그를 설정합니다.Mongo를 초기화할 때 이 시간을 옵션으로 지정할 수 있습니다.옵션으로 DB 객체 [:cache_time] 인덱스에 대한 모든 변경사항은 캐시 시간에 관계없이 전파됩니다(예: 인덱스 방향 변경).

이 메서드의 매개 변수 및 옵션은 Collection#create_index의 매개 변수 및 옵션과 동일합니다.

예:

Call sequence:

Time t: @posts.ensure_index([['subject', Mongo::ASCENDING]) -- calls create_index and sets the 5 minute cache

Time t+2min : @posts.ensure_index([['subject', Mongo::ASCENDING]) -- doesn't do anything

Time t+3min : @posts.ensure_index([['something_else', Mongo::ASCENDING]) -- calls create_index and sets 5 minute cache

Time t+10min : @posts.ensure_index([['subject', Mongo::ASCENDING]) -- calls create_index and resets the 5 minute counter

나는 운전자들이 정확히 똑같이 작동한다고 주장하는 것이 아니라, 단지 설명을 위해 그들의 설명이 IMHO가 조금 더 낫다는 것입니다.

Mongo 3.x에서는 다음과 같은 기능을 제공합니다.인덱스는 더 이상 사용되지 않으므로 사용하지 마십시오.

버전 3.0.0 이후로는 사용되지 않습니다. db.collection.sure인덱스()는 이제 db.collection.create의 별칭입니다.색인().

피몽고에서도 마찬가지입니다.

사용되지 않음 - 이 컬렉션에 인덱스가 있는지 확인합니다.

그 말은 당신이 항상 사용해야 한다는 것을 의미합니다.create_index.

ensureIndex and 대화방법및의셸형및▁in▁method▁the.ensure_index파이썬 드라이버에서는 같은 단어가 사용되지만 다른 것들이 있습니다. 다 둘다create_index그리고.ensure_indexpython 드라이버의 method는 인덱스를 영구적으로 생성합니다.

아마도 누군가가 사용할 것입니다.ensure_index그런 상황에서 합리적인 TTL로, 왜냐하면 나는 확신할 수 없기 때문입니다.create_index사용자가 인덱스를 호출할 때마다 인덱스를 다시 만듭니다.일반적으로 레크리에이션은 바람직하지 않으며 많은 작업이 필요할 수 있습니다.하지만 심지어ensure_index(Python 또는 Ruby 드라이버의) TTL이 만료되거나 다른 클라이언트 인스턴스에서 호출하거나 다시 시작한 후 인덱스를 재생성할 수 있습니다.저는 이것에 대해 확신할 수 없습니다.

아마도 훨씬 더 나은 가능성은 먼저 확인하고, 방법을 사용하는 것입니다.index_information()인덱스가 이미 존재하는 경우.이미 존재하는 경우 다시 만들지 않습니다.

나는 지금 용어가 어떻게 사용되는지 보여주고 있습니다.ensure_index(또는)ensureIndex는 두 뜻으로 됩니다.

데이터베이스에 아직 존재하지 않는 경우 색인을 작성합니다.

이것이 대화형 셸 방법입니다.ensureIndex()실행:실행:

http://www.mongodb.org/display/DOCS/Indexes#Indexes-Basics

한또.Node.JS MongoDB Driver다음과 같이 동작합니다.

https://github.com/mongodb/node-mongodb-native/blob/master/lib/mongodb/collection.js

:function ensureIndexcollection.js.)

'드라이버 캐시'에 없는 경우 인덱스를 생성합니다.

여기서 동일한 식별자가 다른 의미로 사용되어 혼란스럽습니다.

python과 ruby 드라이버는 최근에 만들어진 인덱스에 대한 정보를 메모리에 저장하며, 이 동작을 '캐싱'이라고 부릅니다.

이 캐시에 대해 데이터베이스에 알리지 않습니다.

이 메커니즘의 결과는, 만약 당신이 전화를 한다면.create_index또는ensure_indexTTL 값(수명)을 처음으로 사용하면 드라이버가 데이터베이스에 인덱스를 삽입하고 이 삽입을 기억하며 TTL 정보를 메모리에 저장합니다.여기에 캐시된 것은 시간과 인덱스입니다.

다음에 전화할 때ensure_index동일한 드라이버 인스턴스에서 동일한 컬렉션의 동일한 인덱스를 사용하여ensure_index명령은 첫 번째 호출 이후 아직 TTL 초가 지나지 않은 경우에만 인덱스를 다시 삽입합니다.

당신이 면시하화에 전화를 한다면,create_index인덱스는 첫 번째 호출 이후 얼마나 시간이 경과했는지에 관계없이 항상 삽입됩니다. 물론 첫 번째 호출인 경우에도 마찬가지입니다.

입니다. " " " 를 . 다음을 검색하십시오.def ensure_indexcollection.py:

https://github.com/mongodb/mongo-python-driver/blob/master/pymongo/collection.py

그고루드라버이비요보, ▁for,요▁and▁search를 검색해 보세요.def ensure_indexcollection.rb:

https://github.com/mongodb/mongo-ruby-driver/blob/master/lib/mongo/collection.rb

서로 다른 클라이언트 인스턴스는 다른 클라이언트 인스턴스의 캐싱에 대해 알지 못합니다. 이 정보는 메모리에만 저장되며 인스턴스별로 저장됩니다.클라이언트 응용 프로그램을 다시 시작하면 새 인스턴스가 이전 '캐시된' 인덱스가 삽입된 것을 알지 못합니다.또한 다른 고객들은 서로에게 말하지 않고 알지 못합니다.)

저는 파이썬 드라이버나 루비 드라이버가 이미 존재하는 인덱스를 삽입할 때 DB에서 어떤 일이 일어나는지 아직 완전히 이해하지 못했습니다.나는 그들이 이 경우에 아무것도 하지 않는다고 의심할 것입니다, 더 말이 되고 또한 그들의 행동과 일치할 것입니다.Interactive Shell그리고 JS 드라이버.

모든 인덱스는 영구적입니다.esture_index()는 create_index() 주변의 작은 래퍼일 뿐입니다.

보증인인덱스() 함수는 인덱스가 존재하지 않는 경우에만 인덱스를 만듭니다. " " "

임시 인덱스나 임시 인덱스와 같은 것은 없습니다.

답변과 문서 자체에서 말한 것처럼 create_index를 대신 사용해야 합니다.인덱스()는 더 이상 사용되지 않으며, https://docs.mongodb.com/manual/reference/method/db.collection.createIndex/ # 존재하는 인덱스를 생성하므로 create_index를 사용해야 합니다.

"db.collection.create를 호출하면이미 존재하는 인덱스의 인덱스()는 MongoDB가 인덱스를 다시 만들지 않습니다."

메타클래스와 ORM을 만드는 것을 추천합니다.metaclass init에서 init_schema 메서드를 호출하여 카운터, 스키마, 키 등을 초기화합니다.이렇게 하면 esture_index를 쿼리 또는 컬렉션 업데이트마다 호출하지 않습니다. :)

언급URL : https://stackoverflow.com/questions/5912661/pymongo-mongodb-create-index-or-ensure-index

반응형