programing

MongoDB에서 _id 유형을 정수로 변경하는 것이 나쁜가요?

closeapi 2023. 7. 5. 20:44
반응형

MongoDB에서 _id 유형을 정수로 변경하는 것이 나쁜가요?

MongoDB는 _id에 ObjectId 유형을 사용합니다.

_id를 증분 정수로 만들면 나쁠까요?

(이 보석과 함께, 당신이 관심이 있다면)

아니요, 전혀 나쁘지 않고 사실 내장되어 있습니다.ObjectId인덱스 내에서 크기가 상당히 크기 때문에 당신이 더 나은 것을 가지고 있다고 믿는다면 당신은 기본값을 변경하는 것을 환영합니다._id무엇이든 할 수 있습니다.

그러나 이는 문제이지만, 기본 공식화에서 벗어나기로 결정할 때 고려해야 할 사항이 있습니다.ObjectId특히 여기에 표시된 것처럼 자동 증분 _ids를 사용하는 경우: https://docs.mongodb.com/v3.0/tutorial/create-an-auto-incrementing-field

멀티 스레드는 큰 문제가 아닙니다.findAndModify그리고 원자 자물쇠가 실제로 그것을 처리할 수 있지만, 당신은 당신의 첫 번째 문제에 부딪힙니다. findAndModify는 가장 빠른 기능도, 가장 가벼운 기능도 아니며 정기적으로 사용할 때 상당한 성능 저하가 관찰되었습니다.

당신은 또한 이것을 스스로 수행하는 것의 간접비를 고려해야 합니다, 심지어 그것 없이도.findAndModify삽입할 때마다 추가 쿼리가 필요합니다.삽입할 때마다 고유성을 쿼리해야 하는 고유 ID가 있다고 상상해 보십시오.결국 삽입률이 크롤로 떨어지고 잠금 시간이 증가합니다.

물론입니다.ObjectId삽입하기 전에 데이터베이스를 터치하여 고유성을 확인하거나 공식화하지 않고도 고유성을 유지할 수 있으므로 오버헤드가 발생하지 않습니다.

여전히 정수 _id가 시나리오에 적합하다고 느낀다면, 그렇게 하십시오. 하지만 위에서 설명한 오버헤드는 염두에 두지 마십시오.

이렇게 할 수 있지만 정수가 고유한지 확인해야 합니다.

MongoDB는 대부분의 SQL 데이터베이스처럼 자동 증분 필드를 지원하지 않습니다.새 데이터베이스 항목을 만드는 프로세스 및/또는 스레드가 여러 개 있는 분산 또는 멀티스레드 응용 프로그램이 있는 경우에는 동일한 카운터를 사용해야 합니다.그렇지 않으면 두 개의 스레드가 동일한 _id를 가진 문서를 데이터베이스에 저장하려고 할 수 있습니다.

그렇게 되면, 그 중 하나는 실패할 것입니다.즉, GetLastError를 호출하거나 쓰기 문제를 Acknowledged로 설정하여 데이터베이스가 성공 또는 오류를 반환할 때까지 기다려야 하며, 이는 단순한 데이터 전송 방식보다 더 오래 걸립니다.

저는 이것에 대한 사용 사례가 있었습니다. _id를 검색을 위한 문서 인덱스의 simhash를 나타내는 64비트 정수로 대체했습니다.

제가 "Get or Create"를 의도했기 때문에, 초기 simhash를 제공하고 만약 존재하지 않는다면 새로운 레코드를 만드는 것은 완벽했습니다.또한 Google을 사용하는 모든 사용자를 위해 MongoDB 지원팀은 simshash가 샤드 및 스케일링에 절대적으로 완벽하며, 더 일반적인 ObjectId보다 훨씬 낫다고 설명했습니다. 왜냐하면 simshash는 데이터를 완벽하고 본질적으로 분할하기 때문입니다.그러면 음수 공간에 대한 키가 저장됩니다(uint64는 objectId보다 훨씬 작으므로 저장해야 함).

또한 Google 사용자의 경우 MongoDB_id를 objectId가 아닌 다른 것으로 바꾸는 것은 매우 간단합니다. _id가 정의된 개체를 만들기만 하면 됩니다. 원하는 경우 정수를 사용하십시오.이상입니다: Mongo는 그것을 사용할 것입니다.동일한 _id로 문서를 작성하려고 하면 오류가 발생합니다(E11000/Duplicate 키).저와 마찬가지로, 심해싱을 사용한다면, 이것은 모든 면에서 이상적입니다.

언급URL : https://stackoverflow.com/questions/14054384/is-it-bad-to-change-id-type-in-mongodb-to-integer

반응형