Lưu ngày giờ trong mongodb

Bài viết thuộc quyền Phạm Quang Minh - Minh Monmen. Techmaster đã đăng bài có sự cho phép của tác giả

Link bài viết gốc https. //kipalog. com/posts/Nghe-thuat-index-MongoDB--5-ke-sach-co-the-cac-ha-chua-biet

Thầy Phạm Quang Minh hiện tại là giảng viên Techmaster trong các Khoa Lộ trình đào tạo DevOps cho cá nhân và doanh nghiệp.  


 

Chắc chắn các huynh đệ dev backend bây giờ đã không còn xa lạ gì với 1 cơ sở dữ liệu hết sức phổ biến là mongodb và ai cũng giắt lưng sau lưng dăm ba tuyệt chiêu với cơ sở dữ liệu thần thánh này rồi đúng không?

Hãy bắt đầu

 

Lưu ngày giờ trong mongodb

điều đầu tiên đầu tiên

Khoan đã không làm thế nào. Hãy cùng điểm qua 1 chút về nhà chiến lược gia đại tài mà chúng ta không biết mặt (chính là ta). Tại hạ tên Minh họ Monmen, từng được giang hồ đồn là với nhiều tên dị hợm như Minh béo, Minh mô mần, Minh mũm mĩm,. nhưng với vẻ ngoài đẹp trai cùng tài chém gió kiệt xuất biến không thành có, tại hạ đã làm rất nhiều anh hùng trong thiên hạ Đọc đến dòng này mà tưởng có gì mà kinh khủng. Nhưng mà không có đâu, chỉ là nhân ngày đầu xuân năm mới, tại hạ cũng thu xếp lại trí nhớ lộn xộn của bản thân và nhận ra nó cần sắp xếp lại nên mở bát luôn bằng 1 bài đánh index mongodb cho ngăn nắp. Đây là 1 trong những kiến ​​thức tại hạ tâm đắc nhất được đúc kết từ 4 năm sử dụng mongodb cho tới giờ

Kính mời các huynh đệ theo dõi

Kế sách 1. Nhất hạ chỉ số song trường (hay còn gọi là nhất hạ hỏa song điêu)

Theo thư tịch cổ về mongodb thì chiếc DB thần thánh này thường chỉ hỗ trợ duy nhất 1 index cho 1 truy vấn. (Các hạ đừng nhầm lẫn với việc không hỗ trợ nhiều index 1 truy vấn nha, nó có hỗ trợ nhưng chỉ trong 1 số trường hợp hạn chế). Chính vì vậy mà trường phái đánh index cho mongodb trở nên thịnh hành với chỉ số hỗn hợp chiêu thức (khác với hệ sql như mysql thường thịnh hành chỉ số 1 trường). Chiêu thức đánh index này cho phép các huynh đệ đánh 1 index sử dụng nhiều trường thay vì 1. Chính vì vậy chỉ cần 1 mục lục là có thể thoải mái thoải mái hỗ trợ cho thắc mắc của các huynh đệ

Trường bài hát chỉ mục hạ nhất là kế sách tận hưởng 1 chỉ mục tổng hợp để giải quyết vấn đề của truy vấn trên nhiều trường

Điều kiện thi công

  • Thường xuyên sử dụng truy vấn với bộ lọc, sắp xếp nhiều trường
  • Truy vấn có sự xuất hiện của trường toàn bộ hoặc tiền tố (trong bộ lọc và sắp xếp)

Cách thức phát triển

Xác định trường số thường xuyên được sử dụng và đưa vào chỉ mục

  • Đề xuất tối đa 4 trường. Nếu phải đánh 4 trường trở lên, hãy cân nhắc kỹ cách tiếp cận khác
  • 4 trường được đưa vào chỉ mục thường bao gồm các kiểu. tìm kiếm chính xác, tìm khoảng tìm kiếm, sắp xếp kết quả

Specify thứ tự của các trường trong chỉ mục. Nói chung, có 1 số cách xác định mức độ ưu tiên cho việc đặt thứ tự như sau

  • Theo truy vấn đặc điểm. chính xác > khoảng > sort
  • Theo đặc điểm dữ liệu. nhiều giá trị khác nhau > ít giá trị khác nhau
  • THEO ĐẶC ĐIỂM ĐẶC BIỆT.
    db.test.createIndex({fieldName: 'hashed'});
    
    0 > 
    db.test.createIndex({fieldName: 'hashed'});
    
    1 (cách này để tối ưu hóa cho các trường hợp muốn tái sử dụng tiền tố chỉ mục)

Specify the sort of the field in index. This is to support for too sort. Theo đó

  • If only sort 1 field, not quan trọng
  • Nếu trường sắp xếp 2 trở lên, thì 2 trường đó phải có chiều tương tự mà chỉ mục hỗ trợ. Ví dụ chỉ mục 
    db.test.createIndex({fieldName: 'hashed'});
    
    2 sẽ chỉ hỗ trợ 
    db.test.createIndex({fieldName: 'hashed'});
    
    3 hoặc 
    db.test.createIndex({fieldName: 'hashed'});
    
    4
db.test.createIndex({a: 1, b: 1, c: 1});

Lưu ý

  • Không nên bỏ index field vì nó làm index trở nên nặng nề, khó lưu trữ toàn bộ trên ram
  • Nhiều chú ý tới các trường thứ tự
  • Cân nhắc giữa việc thay đổi trường thứ tự và tạo 1 chỉ mục khác dựa trên tần suất sử dụng của từng chỉ mục

Nghệ thuật ở đây chính là việc các huynh đệ phải cân nhắc lợi hại của việc thay đổi thứ tự các lĩnh vực khi đánh index. Có 1 số nhận định mà các huynh đệ có thể tham khảo

  • Các trường kiểu 
    db.test.createIndex({fieldName: 'hashed'});
    
    5, 
    db.test.createIndex({fieldName: 'hashed'});
    
    6,. thường đứng đầu tùy chọn kinh doanh. Thường có phân vùng vừa phải + so sánh chính xác
  • Các trường kiểu 
    db.test.createIndex({fieldName: 'hashed'});
    
    7, 
    db.test.createIndex({fieldName: 'hashed'});
    
    8,. thường đứng giữa. Các trường này thường có kiểu tìm kiếm chính xác nhưng tốc độ phân tán thấp, trong truy vấn thường phải đi kèm với 1 trường phía trên. Ngoại trừ các trường hợp mang yếu tố quản trị, báo cáo mà các trường này đi riêng lẻ
  • Các kiểu trường 
    db.test.createIndex({fieldName: 'hashed'});
    
    9 thường đứng giữa hoặc cuối. Các trường này thường được sử dụng trong tìm kiếm khoảng cách hoặc sắp xếp
  • Các trường kiểu 
    db.test.find({uniqueField: /^item_123:/});
    
    0 liên tục thường đứng cuối. Các trường này thường được sử dụng để sắp xếp. Với các trường hợp được sử dụng 
    db.test.find({uniqueField: /^item_123:/});
    
    0 để lọc theo khoảng thì thường đi riêng lẻ

Xem thêm tại https. // tài liệu. mongodb. com/manual/core/index-compound/

Kế sách 2. Ve exit hashed (aka ve exitic)

Đôi khi huynh đệ chúng ta phải đối mặt với những trường chứa những dòng văn bản lớn, kiểu như 

db.test.find({uniqueField: /^item_123:/});
2, 
db.test.find({uniqueField: /^item_123:/});
3, 
db.test.find({uniqueField: /^item_123:/});
4, 
db.test.find({uniqueField: /^item_123:/});
5. mà đặc điểm của nó là rất dài. Những trường này thường xuất hiện khi tìm kiếm chính xác. Thế nhưng đánh chỉ mục những trường văn bản này lại có những vấn đề

  • Dung lượng chỉ số lớn, không thể chứa được trên ram hoặc giảm hiệu suất
  • Chạm vào giới hạn 1024 ký tự của mongodb cho 1 trường được lập chỉ mục

Vì sao phải vượt qua kẻ địch mạnh như hổ danh này?

Rất đơn giản, hãy sử dụng chiêu thức đã thoát băm. Ta sẽ tránh mặt mạnh nhất của đối thủ là độ dài, tạo 1 vỏ bọc là đánh chỉ mục cho trường này nhưng thật ra là chúng ta sẽ băm giá trị của chúng khi đưa vào chỉ mục. Nếu trường có giá trị dài hơn 1024 ký tự, thì vẫn sẽ lập chỉ mục là bình thường, đồng thời hiệu quả lưu trữ của chỉ mục tăng lên rõ ràng khi dung lượng giảm đáng kể

Hash là thuật toán xử lý ánh xạ 1 giá trị -> 1 hash (thường có độ dài xác định)

Điều kiện thi công

  • Chỉ tìm kiếm chính xác tìm kiếm trên trường văn bản
  • Only used 1 field for search. Do đó, chỉ mục sẽ có hiệu quả với các loại trường có phân tán gần như duy nhất

Cách thức phát triển

Thật may mắn là mongodb Hỗ trợ chúng ta công việc này 

db.test.find({uniqueField: /^item_123:/});
6, tất cả công việc chúng ta cần làm là tạo ra 1 chỉ mục được băm như sau

db.test.createIndex({fieldName: 'hashed'});

Lưu ý

  • Hashed index không hỗ trợ compound index
  • Chỉ mục băm không hỗ trợ tìm khoảng tìm kiếm, tìm tiền tố tìm kiếm, sắp xếp
  • Chỉ mục băm không hỗ trợ duy nhất

Usecase thường gặp nhất khi sử dụng chiêu thức này thường là ở các hệ thống xác thực khi tìm kiếm 1 bản ghi trong db với 1 chuỗi mã thông báo dài ngoằng

Xem thêm tại https. // tài liệu. mongodb. com/manual/core/index-hashed/

Kế sách 3. Mượn tiền tố hoàn hồn duy nhất (hay còn gọi là mượn xác hoàn hồn)

Chỉ mục duy nhất trên 1 chuỗi vốn được coi là đau đầu trong kỹ thuật đánh chỉ mục do nó làm chậm đi rất nhiều quá trình chèn và cập nhật dữ liệu phải đảm bảo tính duy nhất, cộng thêm với việc chỉ mục duy nhất không được sử dụng băm . Do đó, chỉ mục duy nhất dựa trên chuỗi sẽ được xử lý tương ứng với 1 trường bình thường và sẽ rất nhiều dung lượng

Đây là kẻ địch mà chúng ta không thể tránh khỏi, cũng không có cách nào làm vòng qua nó được khi yêu cầu bài toán đã đặt ra thế. Tuy nhiên tại đã hạ nghiệm ra 1 chiêu thức biến chiếc chỉ số độc nhất vô nhị nặng nề trở nên hữu ích hơn chính là tiền tố độc nhất vô nhị

Bản chất của chiêu thức này chính là việc sử dụng những thông tin trong chỉ mục duy nhất để phục vụ cho 1 mục đích khác. Qua đó tận dụng được khả năng tìm kiếm theo tiền tố của chỉ mục duy nhất và tăng khả năng sử dụng của nó

Điều kiện thi công

  • Chỉ số duy nhất sinh ra từ kết hợp của nhiều thông tin
  • Chỉ mục duy nhất có thể là chỉ mục phức hợp hoặc chỉ mục cho 1 chuỗi trường bình thường

Cách thức phát triển

Tạo khóa duy nhất bằng cách đưa ra các trường có giá trị tìm kiếm và có mức độ phân tán lớn lên khóa đầu. Ví dụ khóa duy nhất là sự kết hợp của 1 số thông tin. item_id, other_id,. ,loại, user_id. Vì số lượng thành tố không được xác định nên tại hạ chuỗi khóa chứ không sử dụng các trường riêng lẻ với chỉ mục phức hợp

khóa duy nhất.

db.test.find({uniqueField: /^item_123:/});
7

Việc sắp xếp này tương tự như sắp xếp thứ tự 1 chỉ số phức hợp, khi đưa ra những dữ liệu cần tìm kiếm lên phía trên, cung cấp các dữ liệu ít quan trọng hơn phía dưới. Ở đây là tại hay hạ tầng tìm kiếm theo 

db.test.find({uniqueField: /^item_123:/});
8, 
db.test.find({uniqueField: /^item_123:/});
9, còn user_id không cần thiết vì lưu trữ bên ngoài và chỉ mục bên ngoài

Như vậy, khi tìm kiếm toàn bộ các bản ghi có giá trị 

db.test.find({uniqueField: /^item_123:other_2:/});
0 sẽ có định dạng tìm kiếm theo Regex như sau

db.test.find({uniqueField: /^item_123:/});

Hay sâu hơn đến 

db.test.find({uniqueField: /^item_123:other_2:/});
1

db.test.find({uniqueField: /^item_123:other_2:/});

Với chỉ mục duy nhất dựa trên chỉ mục phức hợp thì cách làm tương tự, tận dụng các trường là tiền tố của chỉ mục

Lưu ý

  • Chỉ áp dụng được với tìm kiếm tiền tố tìm kiếm regex. Unable to search 1 value not prefix
  • Độ lớn của chỉ mục không bị mất đi, chỉ là 1 kiểu tận hưởng sự hao phí có sẵn cho chỉ mục này

Các kế hoạch này thường được hạ sử dụng để tận dụng nguồn lực, sử dụng trong các trường hợp cần cập nhật hoặc xóa hàng dựa trên 1 dữ liệu xuất hiện trong khóa duy nhất nhưng không cần xuất hiện ở bên ngoài (hoặc có ở bên ngoài nhưng không cần thiết)

Xem thêm tại

Kế sách 4. Diệu giá ly chỉ (hay còn gọi là điệu hổ ly sơn)

Nhớ ngày xưa Tôn Sách muốn đánh chiếm Lư Giang nhưng lại húc phải binh hùng tướng mạnh của Lưu Huân đang trấn thủ. Lúc đó Tôn Sách đã sử dụng kế dụ Lưu Huân xuất binh đi đánh Thượng Liễu để nhân cơ hội đánh úp Lư Giang. Đó gọi là kế Điệu hổ ly sơn

Ngày nay đứng trước một thế lực cực kỳ mạnh mẽ đó là chỉ số những trường ít giá trị như 

db.test.createIndex({fieldName: 'hashed'});
8, 
db.test.find({uniqueField: /^item_123:other_2:/});
3, 
db.test.createIndex({fieldName: 'hashed'});
7,. rất kém hiệu quả và dung lượng lớn trên các bộ sưu tập lớn. Tại hạ cũng đã sử dụng kế sách Điệu giá trị ly chỉ số nhằm làm suy yếu dung lượng của chỉ mục, từ đó làm cho chỉ số Ít dung lượng hơn và hiệu quả hơn

Cách lập chỉ mục này được gọi là chỉ mục một phần

Chỉ mục một phần là loại chỉ mục dựa trên 1 điều kiện nhất định. Tức là chỉ những bản ghi nào không thỏa mãn điều kiện mới được lập chỉ mục. Do đó chỉ số dung lượng sẽ giảm xuống. Toàn bộ bản ghi không thỏa mãn điều kiện sẽ không được lập chỉ mục

Điều kiện thi công

Kế hoạch này được thi triển có hiệu quả trong 1 số bình tình như sau

  • Bộ sưu tập có số lượng bản ghi lớn (và triệu triệu trở lên)
  • Hệ thống truyền thông chỉ mục không hiệu quả
    • Chỉ mục trên các trường dạng cờ, ít giá trị khác nhau như 
      db.test.createIndex({fieldName: 'hashed'});
      
      8, 
      db.test.find({uniqueField: /^item_123:other_2:/});
      
      3, 
      db.test.createIndex({fieldName: 'hashed'});
      
      7,. nhưng các cờ này được phân bố không đều. Ví dụ 
      db.test.createIndex({fieldName: 'hashed'});
      
      8 có 10% là 0, 20% là 1, 70% là 2
    • Lập chỉ mục trên các trường phân loại đều, nhưng logic nghiệp vụ không sử dụng toàn bộ. Ví dụ chỉ mục trên trường 
      db.test.createIndex({fieldName: 'hashed'});
      
      9
  • Truy vấn luôn luôn sử dụng 1 kiểu điều kiện và thường là điều kiện tối thiểu. Ví dụ luôn truy vấn theo 
    // isDirty là field có giá trị boolean đánh dấu dirty record cần update
    db.test.createIndex(
       { createdAt: 1 },
       { partialFilterExpression: { isDirty: true } }
    )
    
    // Status chứa trạng thái xử lý của 1 bản ghi với phân bố không đều ở trên
    db.test.createIndex(
       { status: 1, createdAt: 1 },
       { partialFilterExpression: { status: { $lt: 2 } } }
    )
    
    // Tạo bảng xếp hạng top user nhưng với điều kiện score > 5
    db.test.createIndex(
       { score: -1, name: 1 },
       { partialFilterExpression: { score: { $gt: 5 } } }
    )
    
    0, hay 
    // isDirty là field có giá trị boolean đánh dấu dirty record cần update
    db.test.createIndex(
       { createdAt: 1 },
       { partialFilterExpression: { isDirty: true } }
    )
    
    // Status chứa trạng thái xử lý của 1 bản ghi với phân bố không đều ở trên
    db.test.createIndex(
       { status: 1, createdAt: 1 },
       { partialFilterExpression: { status: { $lt: 2 } } }
    )
    
    // Tạo bảng xếp hạng top user nhưng với điều kiện score > 5
    db.test.createIndex(
       { score: -1, name: 1 },
       { partialFilterExpression: { score: { $gt: 5 } } }
    )
    
    1

Cách thức phát triển

Xác định số lượng tối thiểu và đặt bộ lọc điều kiện
If index thuộc dạng compound index thì

  • Nếu phần số tối thiểu là 1 giá trị thì không cần đưa trường này vào chỉ mục
  • If the minNUMNUMNUMNUMNUMNUMNUMNUMNUMNUMNUMNUMNUM INTERNATIONAL, tùy chọn để yêu cầu tạo chỉ mục với trường thứ tự bình thường
// isDirty là field có giá trị boolean đánh dấu dirty record cần update
db.test.createIndex(
   { createdAt: 1 },
   { partialFilterExpression: { isDirty: true } }
)

// Status chứa trạng thái xử lý của 1 bản ghi với phân bố không đều ở trên
db.test.createIndex(
   { status: 1, createdAt: 1 },
   { partialFilterExpression: { status: { $lt: 2 } } }
)

// Tạo bảng xếp hạng top user nhưng với điều kiện score > 5
db.test.createIndex(
   { score: -1, name: 1 },
   { partialFilterExpression: { score: { $gt: 5 } } }
)

Lưu ý

  • Kế hoạch lập chỉ mục này rất hiệu quả với các trường hợp cần tìm kiếm, sắp xếp trên 1 tập hợp số tối thiểu cho trước. Nên nhớ số lượng và cho trước là 2 yếu tố quyết định thành bại của chiến thuật này
  • Không hiệu quả với các trường hợp đa số vì chỉ số dung lượng không giảm được mấy

Điều trị chỉ mục giá trị được tại hạ thi phát triển rất hiệu quả trên các bộ sưu tập hàng chục triệu tới hàng trăm triệu bản ghi với dung lượng chỉ mục chỉ khoảng vài MB đổ lại khi đã lọc được giá trị tối thiểu để cho vào bộ lọc. Việc tiết kiệm điện dung lượng của chỉ số rất quan trọng trong công việc chắc chắn mongodb sẽ ghép các chỉ số của chúng ta vào ram, từ đó nâng cao hiệu quả xử lý chỉ số

Xem thêm tại https. // tài liệu. mongodb. com/manual/core/index-partial/

Kế sách 5. Vô chỉ thắng hữu chỉ (aka vô chiêu thắng hữu chiêu)

Kế sách cuối cùng và cũng là bí công bội thừa của trưởng môn phái mongo tại hạ đúc kết đơn giản là Vô chỉ số thắng hữu chỉ số. Tuy rút gọn nhưng kế sách này có bảy bảy bóng chín cách biến hóa và rất khó bắt. Tại hạ hiện tại cũng chỉ nắm được 1 số cách biến hóa cơ bản của kế sách này, và khi thực hiện nó cũng vẫn còn bập bõm lắm

Nói một cách ngắn gọn. Chỉ số hiệu quả nhất là KHÔNG CÓ CHỈ SỐ

vietsub. Cách hiệu quả nhất index is not index

Nói thông tin tức thời là sao?

Viết hiệu suất

Làm 1 phép toán cơ bản

1 tôi. 1 hành động đọc hoặc ghi vào đĩa

chèn 1 bản ghi = 1 IO (đối với dữ liệu) + n IO (n là số chỉ mục)
xóa 1 bản ghi = 1 IO (đối với dữ liệu) + n IO (n là số chỉ mục)
cập nhật 1 bản ghi = 1 IO (để xóa dữ liệu cũ) + 1 IO (để tạo dữ liệu mới) + n IO (n là số chỉ mục)

Càng nhiều chỉ mục, ta càng cần nhiều thao tác IO để thực thi với mỗi hành động. Điều này làm giảm tốc độ ghi

Vì vậy nên

  • Chỉ số tiết điện lượng
  • Không lập chỉ mục bãi trống
  • Tạo các chỉ mục có thể tái sử dụng trong nhiều trường hợp hơn

Kho

Không cần nhắc đến disk storage cho index (do disk cực rẻ) thì index cần được lưu trong ram để cho kết quả tìm kiếm tốt nhất, do vậy tạo càng nhiều index hay index càng nặng thì dung lượng ram sử dụng càng tăng. Để index tràn ram là thứ cuối cùng các vị huynh đệ muốn xảy ra trên con mongo của mình

Làm sao để tiết kiệm điện?

  • Một lần nữa, tạo chỉ mục và sử dụng lại hiệu quả chỉ mục
  • Sử dụng kế sách 2, 3, 4 ở hạ vừa bày ở trên để giảm dung lượng 1 chỉ mục không thể cắt bỏ

Kinh nghiệm cá nhân

Sau con đường đi lấy kinh đầy gai và đau khổ, tại hạ đã lĩnh hội được 1 số chân kinh sau

  • Trên các hệ thống ghi thao tác nhiều, ví dụ các hệ thống theo dõi, ghi nhật ký, thì KHÔNG TẠO CHỈ SỐ. Sử dụng 1 chỉ mục mặc định duy nhất là id chỉ mục. Đừng nghĩ rằng id là vô dụng khi MongoID được cấu hình từ dấu thời gian và các thành phần ngẫu nhiên. Từ đó cho phép ta truy vấn dựa trên thời gian, sắp xếp rất hiệu quả. Với những thao tác hàng loạt trên mongo trong các hệ thống phân tích dữ liệu thì tại hạ luôn luôn sử dụng việc chia khoảng id để xử lý. Vô cùng hữu hiệu và không cần tạo thêm bất kỳ chỉ mục nào cả
  • Biến thể khác của No index chính là sharding. Tức là thay vì phải tạo chỉ mục cho 1 trường nào đó thì ta tách hẳn nó thành các bộ sưu tập khác nhau. This is khoai khoai lang and option on each system system. Ví dụ tách bản ghi đã xóa sang 1 bộ sưu tập khác chứ không lưu trường 
    // isDirty là field có giá trị boolean đánh dấu dirty record cần update
    db.test.createIndex(
       { createdAt: 1 },
       { partialFilterExpression: { isDirty: true } }
    )
    
    // Status chứa trạng thái xử lý của 1 bản ghi với phân bố không đều ở trên
    db.test.createIndex(
       { status: 1, createdAt: 1 },
       { partialFilterExpression: { status: { $lt: 2 } } }
    )
    
    // Tạo bảng xếp hạng top user nhưng với điều kiện score > 5
    db.test.createIndex(
       { score: -1, name: 1 },
       { partialFilterExpression: { score: { $gt: 5 } } }
    )
    
    2, hay tách loại _______34_______3, loại 
    // isDirty là field có giá trị boolean đánh dấu dirty record cần update
    db.test.createIndex(
       { createdAt: 1 },
       { partialFilterExpression: { isDirty: true } }
    )
    
    // Status chứa trạng thái xử lý của 1 bản ghi với phân bố không đều ở trên
    db.test.createIndex(
       { status: 1, createdAt: 1 },
       { partialFilterExpression: { status: { $lt: 2 } } }
    )
    
    // Tạo bảng xếp hạng top user nhưng với điều kiện score > 5
    db.test.createIndex(
       { score: -1, name: 1 },
       { partialFilterExpression: { score: { $gt: 5 } } }
    )
    
    4 ra 2 bộ sưu tập x, y chứ không lưu trường 
    db.test.createIndex({fieldName: 'hashed'});
    
    7 nữa,
  • Biến thể khác của Không có chỉ mục dựa trên số lượng bản ghi mà chỉ mục được trả về trong 1 truy vấn. Nếu bộ sưu tập có số lượng bản ghi từ vài trăm ngàn đến vài triệu và 1 phần truy vấn thu hút lớn trong số đó được đưa ra để tính toán (ví dụ khi tổng hợp), thì việc đánh chỉ mục (và mongo sử dụng chỉ mục đó) có thể còn chậm . Lý do là vì quét bộ sưu tập, các bản ghi sẽ được đọc theo khối lưu trữ, trong khi quét chỉ mục thì đọc kiểu truy cập ngẫu nhiên. Do vậy mà khi số lượng bản ghi khớp với truy vấn đủ lớn thì việc đọc từng khối trên đĩa trong quá trình quét bộ sưu tập sẽ nhanh hơn việc đọc theo chỉ mục. Do đó việc loại bỏ chỉ mục là điều kiện cần thiết

Tổng kết

Nhờ áp dụng những kế sách thần thánh trên, tại hạ quản trị thành công cơ sở dữ liệu có nhiều thao tác nhất và nặng nề nhất mạng xã hội GAPO chỉ với 2 CPU + 12GB ram + 3000 IOPS disk. Hiện tại thì dữ liệu cũng tầm hàng trăm triệu, hàng trăm GB, hàng ngày thêm, sửa, xóa hàng triệu bản ghi và sử dụng thường xuyên trực tiếp ~ 2000 IOPS

Tới đây, tại hạ còn sức tàn lực kiệt phải kết lại cuốn tàn thư đã truyền này. Rất mong các vị huynh đệ bạt bạt trên giang hồ có tuyệt chiêu nào hay, hay món võ nào tâm đắc có thể đóng góp ý kiến ​​để tại hạ được tầm nhìn xa. Xin cảm ơn