programing

MongoDB, 인덱스된 필드에 대한 정규식에 의한 쿼리 성능

topblog 2023. 5. 3. 20:45
반응형

MongoDB, 인덱스된 필드에 대한 정규식에 의한 쿼리 성능

(MongoDB의 50K 계정 모음에서) 이름으로 계정을 찾고 싶습니다.

일반적인 방법으로: 우리는 끈으로 찾습니다.

db.accounts.find({ name: 'Jon Skeet' })  // indexes help improve performance!

규칙적인 표현은 어떻습니까?수술비가 많이 드나요?

db.accounts.find( { name: /Jon Skeet/ }) // worry! how indexes work with regex?

편집:

Wired Prairie에 따르면:
MongoDB는 ReGEx 접두사를 사용하여 인덱스를 검색합니다(예:/^prefix.*/):

db.accounts.find( { name: /^Jon Skeet/ })  // indexes will help!'

MongoDB $regex

사실 그 문서에 따르면,

필드에 인덱스가 있는 경우 MongoDB는 정규식을 인덱스의 값과 일치시키므로 수집 검사보다 빠를 수 있습니다.정규식이 "접두사 표현식"인 경우 추가 최적화가 발생할 수 있습니다. 즉, 모든 잠재적 일치 항목이 동일한 문자열로 시작됩니다.이를 통해 MongoDB는 해당 접두사에서 "범위"를 구성하고 해당 범위에 속하는 인덱스의 값과만 일치시킬 수 있습니다.

http://docs.mongodb.org/manual/reference/operator/query/regex/ #index-use

즉, 다음과 같습니다.

위해서/Jon Skeet/regex,mongo는 인덱스의 키를 완전히 스캔한 다음 일치하는 문서를 가져올 것이며, 이는 수집 스캔보다 빠를 수 있습니다.

위해서/^Jon Skeet/regex ,mongo는 인덱스의 regex로 시작하는 범위만 검색하며, 이는 더 빠를 것입니다.

검색 성능에 문제가 있는 사람이 있는 경우 문장에서 단어를 검색하더라도 정규식 검색을 최적화할 수 있는 방법이 있습니다(처음에 반드시 검색할 필요는 없음).^아니면 끝$현의).

필드에 텍스트 색인이 있어야 합니다.

db.someCollection.createIndex({ someField: "text" })

의 쿼리는 먼저 일반 검색을 수행한 후에만 정규식을 사용해야 합니다.

db.someCollection.find({ $and: 
  [
    { $text: { $search: "someWord" }}, 
    { someField: { $elemMatch: {$regex: /test/ig, $regex: /other/ig}}}
  ]
})

이렇게 하면 정규식은 이 필드의 인덱스 덕분에 상당히 빠른 초기 일반 검색 결과에 대해서만 실행됩니다.컬렉션의 크기에 따라 검색 성능에 큰 영향을 미칠 수 있습니다.

언급URL : https://stackoverflow.com/questions/17501798/mongodb-performance-of-query-by-regular-expression-on-indexed-fields

반응형