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

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

MongoDB hỗ trợ các biểu thức chính quy bằng cách sử dụng toán tử $ regex. Tuy nhiên, các truy vấn MongoDB regex này có một nhược điểm, tất cả trừ một loại regex sử dụng kém các chỉ mục và dẫn đến các vấn đề về hiệu suất. Đối với một máy chủ sản xuất có lượng lớn dữ liệu, một truy vấn regex không hợp lệ có thể khiến máy chủ của bạn ngừng hoạt động.

Các truy vấn dựa trên MongoDB regex là một truy vấn khá phổ biến trong hầu hết các ứng dụng sử dụng MongoDB. Điều này tương tự với thao tác ‘LIKE’ được hỗ trợ trên hầu hết các cơ sở dữ liệu quan hệ. Cú pháp của lệnh như sau

{ $regex: /pattern/, $options: '<options>' }
E.g. { name: { $regex: /^acme.*test/}}

Để biết thêm thông tin chi tiết về hoạt động regex và các tùy chọn bổ sung, hãy tham khảo tài liệu MongoDB

Đối với phần còn lại của cuộc thảo luận này, chúng tôi sẽ giả định rằng trường bạn đang đối sánh có một chỉ mục. Nếu bạn không lập chỉ mục, nó sẽ dẫn đến việc quét bộ sưu tập và hiệu suất rất kém. Tuy nhiên, ngay cả khi trường được lập chỉ mục, nó có thể dẫn đến hiệu suất kém. Lý do là MongoDB chỉ có thể sử dụng tốt các chỉ mục nếu biểu thức chính quy của bạn là “biểu thức tiền tố” - đây là các biểu thức bắt đầu bằng ký tự “^”.

Ví dụ. {Name:{$ regex:/ ^ acme /}}

Điều này cho phép MongoDB xác định một loạt các mục nhập chỉ mục có liên quan đến truy vấn này và dẫn đến các truy vấn hiệu quả. Bất kỳ truy vấn nào khác dẫn đến việc quét chỉ mục vì MongoDB không thể thu hẹp quá trình quét thành một loạt các mục nhập chỉ mục. Quét chỉ mục đặc biệt tồi tệ vì tất cả các chỉ mục cần được phân trang vào bộ nhớ và điều này ảnh hưởng đến tập hợp hoạt động của máy chủ của bạn (Trên thực tế, quét chỉ mục có thể dẫn đến hiệu suất kém hơn quét tập hợp - nó dẫn đến số lỗi trang gấp đôi ).

Hãy xem một số ví dụ và kế hoạch truy vấn kết quả. Vì mục đích thử nghiệm của chúng tôi, tôi đã thiết lập một bộ sưu tập với 100k tài liệu. Mỗi tài liệu có một trường FirstName là một chuỗi 16 ký tự.

Ví dụ 1:{name:{$ regex:/ ^ acme /}} Kết quả
:Sử dụng chỉ mục hiệu quả
Kế hoạch truy vấn:

executionStats" : {
       "executionSuccess" : true,
       "nReturned" : 0,
       "executionTimeMillis" : 0,
       "totalKeysExamined" : 1,
       "totalDocsExamined" : 0,

Ví dụ 2:{name:{$ regex:/ ^ acme / i}} Kết quả
:Quét chỉ mục không hiệu quả do yêu cầu không phân biệt chữ hoa chữ thường. Vì vậy, về cơ bản tùy chọn / i phủ định “biểu thức tiền tố”
Kế hoạch truy vấn:

        "executionStats" : {
                "executionSuccess" : true,
                "nReturned" : 0,
                "executionTimeMillis" : 137,
                "totalKeysExamined" : 100000,
                "totalDocsExamined" : 0,

Ví dụ 3:{name:{$ regex:/acme.*corp/}} Kết quả
:Quét chỉ mục không hiệu quả
Kế hoạch truy vấn:

                "executionSuccess" : true,
                "nReturned" : 0,
                "executionTimeMillis" : 167,
                "totalKeysExamined" : 100000,
                "totalDocsExamined" : 0,

Ví dụ 4:{name:{$ regex:/ acme /}} Kết quả
:Quét chỉ mục không hiệu quả

        "executionStats" : {
                "executionSuccess" : true,
                "nReturned" : 0,
                "executionTimeMillis" : 130,
                "totalKeysExamined" : 100000,
                "totalDocsExamined" : 0,

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để lấy Spring-Data-MongoDB để xác thực các đối tượng của tôi?

  2. Cập nhật thay đổi giấy phép MongoDB SSPL

  3. Không thể tự động định cấu hình Nguồn dữ liệu:'spring.datasource.url' không được chỉ định

  4. Thực thi Mongo như Truy vấn (JSON) thông qua Java

  5. Làm thế nào để bạn truy vấn cho không phải là null trong Mongo?