MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Truy vấn Mongo mất nhiều thời gian. Làm thế nào để làm cho nó nhanh hơn?

Chỉ mục sẽ cần bao gồm tất cả các phần của truy vấn (phần bình đẳng, phần sắp xếp và phần phạm vi). Điều này là do trong một find() điển hình truy vấn, MongoDB chỉ sử dụng một chỉ mục. Ví dụ:nó thường không sử dụng một chỉ mục cho phần bình đẳng và một chỉ mục khác cho phần sắp xếp.

Nói chung, chuỗi các trường trong chỉ mục cần tuân theo mẫu bình đẳng -> sắp xếp -> phạm vi .

Điều này được mô tả chi tiết trong Tối ưu hóa chỉ mục tổng hợp MongoDB .

Đối với truy vấn của bạn, phần bình đẳng là thẻ tag:..., letterId:... và phần sắp xếp là emailId:-1 . Không có phần phạm vi nào trong truy vấn của bạn.

Sử dụng mẫu này, chỉ mục kết hợp bạn cần là:

db.test.createIndex({tag:1, letterId:1, emailId:-1})

Hãy thử xác nhận mức độ cải thiện hiệu suất mà chúng ta có thể nhận được khi sử dụng chỉ mục này.

Dữ liệu thử nghiệm

Để xác nhận tính phù hợp của chỉ mục, tôi đã chèn 1 triệu bản ghi vào cơ sở dữ liệu thử nghiệm bằng cách sử dụng mgeneratejs , là một công cụ để tạo tài liệu ngẫu nhiên bằng cách sử dụng mẫu.

Dựa trên ví dụ của bạn, mgeneratejs mẫu tôi đang sử dụng là:

$ cat template.json
{
  "emailId": "$hash",
  "email": "$email",
  "letterId": "$hash",
  "sendedFrom": "$email",
  "resultMsg": "$word",
  "owner": "$name",
  "created": "$date",
  "result": "$bool",
  "tag": "$word",
  "tryNum": {"$integer": {"min": 0, "max": 1e3}},
  "clickHash": "$word",
  "links": {"$array": {"of": "$url", "number": {"$integer": {"min": 1, "max": 5}}}}
}

và nhập 1 triệu tài liệu ngẫu nhiên vào MongoDB:

$ mgeneratejs template.json -n 1000000 | mongoimport -d test -c test

Thử nghiệm 1:chỉ số không tối ưu

Sau đó, tôi tạo chỉ mục bạn có và cố gắng tìm một tài liệu không tồn tại và tập hợp 10 lần chạy truy vấn với bộ sưu tập chỉ chứa chỉ mục này:

> db.test.createIndex({emailId: 1, letterId: 1, result: 1, owner: 1, tag: 1, clickHash: 1})

> db.test.find({"tag" : "xyz", "letterId" : "abc"}).sort({emailId: -1}).limit(1)
Fetched 0 record(s) in 3069ms
Fetched 0 record(s) in 2924ms
Fetched 0 record(s) in 2923ms
Fetched 0 record(s) in 3013ms
Fetched 0 record(s) in 2917ms
Fetched 0 record(s) in 2961ms
Fetched 0 record(s) in 2882ms
Fetched 0 record(s) in 2870ms
Fetched 0 record(s) in 2969ms
Fetched 0 record(s) in 2863ms

vì vậy khi sử dụng chỉ mục đó, thời gian phản hồi của truy vấn không lớn, với hầu hết thời gian thực thi gần 3 giây.

Thử nghiệm 2:bình đẳng -> sắp xếp -> chỉ mục phạm vi

Bằng cách thêm bình đẳng -> sắp xếp -> phạm vi tối ưu chỉ mục:

> db.test.createIndex({tag:1, letterId:1, emailId:-1})

> db.test.find({"tag" : "xyz", "letterId" : "abc"}).sort({emailId: -1}).limit(1)
Fetched 0 record(s) in 2ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 1ms
Fetched 0 record(s) in 3ms

Ngược lại, sử dụng chỉ số tối ưu, hiệu suất được cải thiện rõ rệt. Không có truy vấn nào được trả lại trong hơn 3 mili giây, với phần lớn thời gian nó trả về sau 1 mili giây.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cách cài đặt MongoDB trên Ubuntu 18.04

  2. Di chuyển một phần tử từ mảng này sang mảng khác trong cùng một tài liệu MongoDB

  3. Xóa các bản sao trên mongodb

  4. Cách di chuyển dữ liệu trong MongoDB

  5. MongoDB Regex, Chỉ mục &Hiệu suất