>데이터 베이스 >MySQL 튜토리얼 >성능 향상을 위한 MongoDB 방법 요약

성능 향상을 위한 MongoDB 방법 요약

不言
不言원래의
2018-09-19 15:21:272076검색

이 글은 MongoDB의 성능을 향상시키는 방법을 요약한 것입니다. 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

MongoDB는 고성능 데이터이지만, 사용 과정에서 누구나 가끔 성능 문제에 직면할 수 있습니다. MongoDB를 SQL 등 다른 관계형 데이터베이스와 비교 서버, MySQL, 오라클 이에 비해 상대적으로 새롭고 많은 사람들이 잘 알지 못하기 때문에 많은 개발자와 DBA는 기능 구현에만 집중하고 성능 요구 사항을 무시하는 경우가 많습니다. 실제로 MongoDB와 SQL은 Server, MySQL, Oracle과 마찬가지로 데이터베이스 개체의 디자인 조정, 인덱스 생성 및 문 최적화는 성능에 큰 영향을 미칩니다.

MongoDB의 성능을 최대한 활용하기 위해 다음 18가지 항목을 간단히 요약했습니다. 계속해서 요약하고 개선해 보시기 바랍니다.

(1) 문서 내 _id 키는 기본값을 사용하는 것이 좋으며, _id에 맞춤 값을 저장하는 것은 금지되어 있습니다.

해석: MongoDB 문서에는 "_id" 키가 있으며 기본값은 ObjectID 개체입니다(식별자에는 타임스탬프, 컴퓨터 ID, 프로세스 ID 및 카운터가 포함됨). MongoDB는 _id를 지정하는 경우와 _id를 지정하지 않는 경우 삽입 속도에 큰 차이가 있습니다.

(2) 짧은 필드 이름을 사용하는 것이 좋습니다.

해석: 관계형 데이터베이스와 달리 MongoDB 컬렉션의 각 문서는 필드 이름을 저장해야 하며 긴 필드 이름에는 더 많은 저장 공간이 필요합니다.

(3) MongoDB 인덱스는 문서 쿼리, 업데이트, 삭제, 정렬 작업을 향상시킬 수 있으므로 비즈니스 요구에 따라 적절하게 인덱스를 만듭니다.

(4) 각 인덱스는 삽입 작업에 일정 공간을 차지하게 되어 리소스 소모가 발생하므로 컬렉션별 인덱스 수는 최대한 5개 이내로 조절하는 것이 좋습니다.

(5) 여러 키가 포함된 쿼리의 경우 이러한 키가 포함된 복합 인덱스를 만드는 것이 좋은 솔루션입니다. 복합 인덱스의 키 값 순서는 인덱스의 가장 왼쪽 접두사 원칙을 이해하는 데 매우 중요합니다.

해석: 예를 들어 테스트 컬렉션에 결합 인덱스 {a:1,b:1,c:1}을 만듭니다. 다음 7개의 쿼리 문을 실행합니다.

db.test.find({a:”hello”}) // 1
db.test.find({b:”sogo”, a:”hello”}) // 2
db.test.find({a:”hello”,b:”sogo”, c:”666”}) // 3
db.test.find({c:”666”, a:”hello”}) // 4
db.test.find({b:”sogo”, c:”666”}) // 5
db.test.find({b:”sogo” }) // 6
db.test.find({c:”666”}) // 7

The 위의 쿼리 문은 1, 2, 3, 4로 색인화될 수 있습니다.

쿼리는 가장 왼쪽의 색인 필드를 포함해야 하며 다음을 사용하여 생성되어야 합니다. 인덱스 쿼리 필드의 순서에 관계없이 순서가 우선합니다.

최소 색인이 가장 많은 쿼리를 포괄합니다.

(6) TTL 인덱스(time-to-live 인덱스, 수명주기 인덱스), TTL 인덱스를 사용하면 제한 시간 내에 문서를 에이징할 수 있으며 에이징에 도달하면 문서가 삭제됩니다. 수준. .

해석: TTL을 생성하는 데 사용되는 인덱스는 날짜 유형이어야 합니다. TTL 인덱스는 단일 필드 인덱스이므로 복합 인덱스가 될 수 없습니다. TTL 문서 삭제 백그라운드 스레드는 60초마다 잘못된 문서를 제거합니다. 고정 길이 컬렉션은 지원되지 않습니다.

(7) 컬렉션의 특정 필드에 대한 인덱스를 생성해야 하지만 컬렉션의 많은 문서에 이 키 값이 포함되어 있지 않은 경우 희소 인덱스를 생성하는 것이 좋습니다. .

해석: 색인은 기본적으로 집중형이므로 문서의 색인 필드가 누락되어도 색인에 해당 관계가 있다는 의미입니다. 희소 인덱스에서는 인덱스 키 값을 포함하는 문서만 나타납니다.

(8) 텍스트 인덱스를 생성할 때 필드는 1이나 -1이 아닌 텍스트를 지정합니다. 컬렉션당 하나의 텍스트 인덱스만 있지만 원하는 만큼 많은 필드를 인덱스할 수 있습니다.

해석: 컬렉션 문서의 여러 필드에 대한 비효율적인 쿼리를 대체하려면 텍스트 색인을 사용하는 것이 훨씬 빠릅니다.

(9) findOne을 사용하여 데이터베이스에서 일치하는 여러 항목을 쿼리하면 자연스럽게 정렬된 파일 컬렉션의 첫 번째 항목이 반환됩니다. 여러 문서를 반환해야 하는 경우 find 메소드를 사용하십시오.

(10) 쿼리가 전체 문서를 반환할 필요가 없거나 키 값이 존재하는지 확인하는 데만 사용되는 경우 프로젝션(매핑)을 통해 반환되는 필드를 제한하여 네트워크 트래픽을 줄이고 클라이언트 메모리 사용량.

Interpretation: {key:1}을 설정하여 반환된 필드를 명시적으로 지정하거나 {key:0}을 설정하여 제외해야 하는 필드를 지정할 수 있습니다.

(11) 접두사 스타일 쿼리를 제외하고 정규식 쿼리는 인덱스를 사용할 수 없으며 대부분의 선택기보다 실행하는 데 시간이 더 오래 걸립니다.

(12) 집계 작업에서 $는 일치 및 $group 앞에 와야 합니다. $를 접두사로 사용하면 일치의 접두사를 줄이고 $group 연산자로 처리할 문서 수를 줄일 수 있습니다. .

(13) 연산자를 통해 문서를 수정하면 일반적으로 문서 데이터를 얻고 수정하기 위해 서버를 왔다 갔다 할 필요가 없고, 직렬화 및 전송에 더 많은 시간을 할애할 수 있기 때문에 일반적으로 성능이 더 좋습니다. 데이터가 적습니다.

(14) 일괄 삽입(batchInsert)은 서버에 제출되는 데이터 수를 줄이고 성능을 향상시킬 수 있습니다. 그러나 일괄 제출된 BSON 크기는 48MB를 초과할 수 없습니다.

(15) 한 번에 정렬하기 위해 너무 많은 데이터를 검색하는 것은 금지되어 있습니다. MongoDB는 현재 32M 내에서 결과 집합 정렬을 지원합니다. 정렬이 필요한 경우 결과 집합의 데이터 양을 제한해 보세요.

(16) 쿼리의 일부 $ 연산자(예: $ne, $, not, $exists, $nin, $or)는 성능 저하를 유발할 수 있으므로 비즈니스에서는 사용하지 마십시오.

a) $exist: 느슨한 문서 구조로 인해 쿼리는 모든 문서를 통과해야 합니다.

b) $ne: 부정된 값이 다수인 경우 전체 색인이 스캔됩니다.

c) $not: 쿼리 최적화 프로그램이 어떤 인덱스를 사용해야 하는지 알지 못하게 할 수 있으므로 종종 전체 테이블 스캔으로 성능이 저하됩니다.

d) $nin: 전체 테이블 스캔; table scan; #🎜 🎜#

e) $ 여러 조건이 있는 경우 몇 번 쿼리되고 최종적으로 결과 집합이 병합되는지를 또는로 변경하는 것을 고려해야 합니다. 여러 조건이 있는 경우 결과 집합이 최종적으로 병합되면 $in에 대한 변경을 고려해야 합니다.

(17) 고정 컬렉션을 사용하면 로그를 기록할 수 있으며 데이터 삽입 시 가장 오래된 데이터를 삭제할 수 있습니다. 이 기능은 수요 분석 및 설계 중에 고려할 수 있으므로 성능이 향상되고 삭제가 필요하지 않습니다.

해석: 고정 컬렉션은 명시적으로 생성해야 하며 크기를 지정하고 문서 수를 지정할 수도 있습니다. 어떤 제한에 먼저 도달하더라도 나중에 삽입된 새 문서는 가장 오래된 문서를 제거합니다.

(18) 컬렉션에 포함된 문서의 데이터 양은 쿼리 성능에 영향을 미치므로 적절한 양을 유지하려면 정기적인 보관이 필요합니다.

위 내용은 성능 향상을 위한 MongoDB 방법 요약의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.