Mongodb tạo chỉ mục nếu không tồn tại

Amazon DocumentDB (có khả năng tương thích với MongoDB) là dịch vụ cơ sở dữ liệu tài liệu nhanh, có thể thay đổi quy mô, độ sẵn sàng cao và được quản lý đầy đủ, hỗ trợ khối lượng công việc MongoDB. Bạn có thể sử dụng cùng MongoDB 3. 6 và 4. 0, trình điều khiển và công cụ để chạy, quản lý và thay đổi quy mô khối lượng công việc trên Amazon DocumentDB mà không phải lo lắng về việc quản lý cơ sở hạ tầng bên dưới. Là cơ sở dữ liệu tài liệu, Amazon DocumentDB giúp dễ dàng lưu trữ, truy vấn và lập chỉ mục dữ liệu JSON

Trong bài đăng này, tôi sẽ xem xét các loại chỉ mục khác nhau và cách làm việc tốt nhất với chúng trong Amazon DocumentDB. Lập chỉ mục trong cơ sở dữ liệu không phải là duy nhất—đây là một khái niệm được sử dụng trong hầu hết các công cụ cơ sở dữ liệu. Với Amazon DocumentDB, các chỉ mục giúp cải thiện hiệu suất của các truy vấn. Không có chỉ mục, Amazon DocumentDB phải quét mọi tài liệu trong bộ sưu tập để chọn những tài liệu khớp với truy vấn. Các chỉ mục là các tham chiếu đến tài liệu của bạn, được sắp xếp theo các khóa một cách hiệu quả. Chúng được lưu trữ theo thứ tự sắp xếp, cho phép tra cứu nhanh

Tổng quan về lập chỉ mục

Amazon DocumentDB sử dụng cấu trúc dữ liệu cây B cho các chỉ mục của nó. Chỉ mục cây B sử dụng cấu trúc phân cấp lưu trữ dữ liệu trong các nút của nó theo thứ tự được sắp xếp. Giữ dữ liệu được sắp xếp theo cách này cho phép đọc, chèn và xóa dữ liệu theo cách tiết kiệm bộ nhớ. Khi dữ liệu mới được ghi, ngoài việc sửa đổi các tài liệu trong bộ sưu tập, các chỉ mục cần được cập nhật, điều này có thể ảnh hưởng đến độ trễ ghi và tăng IOPS. Bằng cách chọn các trường có số lượng thẻ cao, chẳng hạn như trường nhận dạng, bạn tăng tính chọn lọc của chỉ mục. Ngược lại, việc chọn một trường có số lượng thẻ thấp, chẳng hạn như Boolean, nơi chỉ có hai giá trị duy nhất, có thể truy xuất nhiều thông tin hơn mức cần thiết, làm tăng mức sử dụng bộ nhớ và nguy cơ đi vào dung lượng lưu trữ phân tán. Mục tiêu của tính chọn lọc chỉ mục là cho phép truy vấn lọc càng nhiều dữ liệu càng tốt từ trước, do đó cho phép bộ xử lý truy vấn thực hiện ít công việc hơn

Khi bạn chạy một truy vấn, Amazon DocumentDB sẽ lọc và truy xuất tài liệu theo hai cách có thể. quét bộ sưu tập hoặc quét chỉ mục. Quá trình quét bộ sưu tập sẽ kiểm tra toàn bộ bộ sưu tập, từng tài liệu một, để tìm sự trùng khớp, đồng thời tính toán và I/O chuyên sâu. Tuy nhiên, bạn có thể làm cho truy vấn của mình hiệu quả hơn bằng cách tạo một chỉ mục giới hạn số lượng tài liệu được truy xuất. Chỉ mục lưu trữ một phần nhỏ của tập dữ liệu, giữ giá trị của một hoặc nhiều trường cụ thể, được sắp xếp theo giá trị của trường đó. Thứ tự này dựa trên thứ tự khóa trong định nghĩa chỉ mục, bắt đầu bằng khóa đầu. Hãy xem xét một danh bạ điện thoại được sắp xếp theo thứ tự bảng chữ cái; . Khi tìm kiếm một số điện thoại, bạn có thể bỏ qua trực tiếp phần chứa chữ cái đầu tiên của họ mà bạn đang tìm kiếm và tiếp tục lọc xuống bằng cách sử dụng tên cho đến khi bạn nhận được kết quả của mình; . Nếu, thay vì được sắp xếp theo họ, danh bạ điện thoại chỉ cần thêm người mới vào thời điểm họ chuyển đến thành phố, thì bạn không còn có thể lọc theo họ. Điều này yêu cầu bạn xem qua toàn bộ danh bạ điện thoại, từng trang một, tìm kiếm kết quả của mình. Điều này tương tự như quá trình quét bộ sưu tập mà Amazon DocumentDB thực hiện khi không có chỉ mục

Các loại chỉ mục

Nếu bạn tạo một chỉ mục trên bộ sưu tập tài liệu của mình, bạn có thể tránh được việc sử dụng I/O và tính toán cao. Bạn có thể chọn từ một số loại chỉ mục

  • Chỉ mục trường đơn
  • chỉ số hợp chất
  • Chỉ số đa phím
  • Chỉ mục đa khóa tổng hợp
  • chỉ số thưa thớt
  • Chỉ số Thời gian để Sống (TTL)

Sau đây là một ví dụ thực tế về cách áp dụng và sử dụng các chỉ mục này. Bộ sưu tập này chứa khoảng 1 triệu tài liệu với các cặp khóa-giá trị sau

rs0:PRIMARY> db.food.findOne()
{
        "_id" : ObjectId("6010bc96f2612d11c720ce01"),
        "name" : "Chefs Table at the Edgewater",
        "cuisine" : "Italian",
        "stars" : 1.6,
        "address" : {
                "street" : "371 Gule Loop",
                "city" : "Ujukamew",
                "state" : "ME",
                "zipcode" : "62421"
        },
        "keywords" : [
                "Italian",
                "Delivery",
                "New"
        ],
        "meals" : [
                "lunch",
                "dinner"
        ],
	 "special_diets" : [
                "vegetarian friendly",
                "vegan options"
        ],
        "patrons" : {
                "name" : "Ted Bracken",
                "visits" : 3,
                "preferences" : {
                        "waiter" : "Pat Reah",
                        "drink" : "iced tea",
                        "allergies" : {
                                "food" : eggs
                        }
                }
        }
}
rs0:PRIMARY> db.food.count()
1000021

Bạn có thể chạy toán tử

               },
                "name" : "_id",
                "ns" : "business.food"
        }
2 để xem tất cả các chỉ mục trên bộ sưu tập

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]

Bạn có thể tìm thấy thông tin sau từ đầu ra này

 "v" : 4,

Đây là phiên bản của chỉ số. Phiên bản 4 là phiên bản mặc định của chỉ mục văn bản

Khi bạn tạo một bộ sưu tập, một chỉ mục mặc định sẽ được tạo trên trường

               },
                "name" : "_id",
                "ns" : "business.food"
        }
3

                "key" : {
                        "id" : 1
                },

Điều này cho bạn thấy trường

               },
                "name" : "_id",
                "ns" : "business.food"
        }
3 là khóa cho chỉ mục của bạn và nó theo thứ tự tăng dần (
               },
                "name" : "_id",
                "ns" : "business.food"
        }
5). Nếu bạn có một chỉ mục trên nhiều trường, chúng sẽ hiển thị trong trường khóa này theo thứ tự chúng được chuyển đến toán tử
               },
                "name" : "_id",
                "ns" : "business.food"
        }
6

Trong đoạn mã sau,

               },
                "name" : "_id",
                "ns" : "business.food"
        }
7 của chỉ mục là
               },
                "name" : "_id",
                "ns" : "business.food"
        }
3 và
               },
                "name" : "_id",
                "ns" : "business.food"
        }
9 là không gian tên chỉ mục, được viết theo định dạng
rs0:PRIMARY> db.food.createIndex({"cuisine":1},{name:"cuisine_asc"})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611136273, 1)
}
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "business.food"
        },
        {
                "v" : 4,
                "key" : {
                        "cuisine" : 1
                },
                "name" : "cuisine_asc",
                "ns" : "business.food"
        }
]
0

               },
                "name" : "_id",
                "ns" : "business.food"
        }

Trong tất cả các ví dụ trong bài đăng này, bạn gọi toán tử

               },
                "name" : "_id",
                "ns" : "business.food"
        }
6 để tạo các chỉ mục, chuyển qua tham số
               },
                "name" : "_id",
                "ns" : "business.food"
        }
7 tùy chọn. Điều này cho phép bạn đặt tên cho các chỉ mục mà bạn chọn. Nếu bạn không bao gồm tham số
               },
                "name" : "_id",
                "ns" : "business.food"
        }
7, tên chỉ mục sẽ nối tên của các trường được lập chỉ mục và thứ tự sắp xếp. Ví dụ: đoạn mã sau tạo một chỉ mục tăng dần trên trường
rs0:PRIMARY> db.food.createIndex({"cuisine":1},{name:"cuisine_asc"})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611136273, 1)
}
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "business.food"
        },
        {
                "v" : 4,
                "key" : {
                        "cuisine" : 1
                },
                "name" : "cuisine_asc",
                "ns" : "business.food"
        }
]
4 và đặt tên là
rs0:PRIMARY> db.food.createIndex({"cuisine":1},{name:"cuisine_asc"})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611136273, 1)
}
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "business.food"
        },
        {
                "v" : 4,
                "key" : {
                        "cuisine" : 1
                },
                "name" : "cuisine_asc",
                "ns" : "business.food"
        }
]
5

rs0:PRIMARY> db.food.createIndex({"cuisine":1},{name:"cuisine_asc"})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611136273, 1)
}
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "business.food"
        },
        {
                "v" : 4,
                "key" : {
                        "cuisine" : 1
                },
                "name" : "cuisine_asc",
                "ns" : "business.food"
        }
]

Nếu bạn không thêm tham số

               },
                "name" : "_id",
                "ns" : "business.food"
        }
7, tên của chỉ mục là
rs0:PRIMARY> db.food.createIndex({"cuisine":1},{name:"cuisine_asc"})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611136273, 1)
}
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "business.food"
        },
        {
                "v" : 4,
                "key" : {
                        "cuisine" : 1
                },
                "name" : "cuisine_asc",
                "ns" : "business.food"
        }
]
7

rs0:PRIMARY> db.food.createIndex({"cuisine":1})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611136477, 1)
}
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                    "_id" : 1
                },
                "name" : "_id_",
                "ns" : "business.food"
        },
        {
                "v" : 4,
                "key" : {
                   "cuisine" : 1
        },
                "name" : "cuisine_1",
                "ns" : "business.food"
        }
]

Chỉ mục trường đơn

Không có bất kỳ chỉ mục bổ sung nào, nếu bạn truy vấn trường

               },
                "name" : "_id",
                "ns" : "business.food"
        }
7 và xem đầu ra của
rs0:PRIMARY> db.food.createIndex({"cuisine":1},{name:"cuisine_asc"})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611136273, 1)
}
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "business.food"
        },
        {
                "v" : 4,
                "key" : {
                        "cuisine" : 1
                },
                "name" : "cuisine_asc",
                "ns" : "business.food"
        }
]
9, điều đó cho thấy rằng bạn đã thực hiện quét bộ sưu tập và có thời gian chạy (
rs0:PRIMARY> db.food.createIndex({"cuisine":1})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611136477, 1)
}
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                    "_id" : 1
                },
                "name" : "_id_",
                "ns" : "business.food"
        },
        {
                "v" : 4,
                "key" : {
                   "cuisine" : 1
        },
                "name" : "cuisine_1",
                "ns" : "business.food"
        }
]
0) là 770. 505 mili giây. Từ truy vấn trước đó của bạn, chúng tôi có thể thấy bộ sưu tập của chúng tôi có hơn 1 triệu tài liệu. Điều này có nghĩa là truy vấn phải xem tất cả 1 triệu tài liệu trong bộ sưu tập để tìm trường tên mà bạn truy vấn trên đó. Xem đoạn mã sau

rs0:PRIMARY> db.food.find({"name":"Chefs Table at the Edgewater"}).explain("executionStats")
{
        "queryPlanner" : {
                "plannerVersion" : 1,
                "namespace" : "business.food",
                "winningPlan" : {
                        "stage" : "COLLSCAN"
                }
        },
        "executionStats" : {
                "executionSuccess" : true,
                "executionTimeMillis" : "770.505",
                "planningTimeMillis" : "0.044",
                "executionStages" : {
                        "stage" : "COLLSCAN",
                        "nReturned" : "9903",
                        "executionTimeMillisEstimate" : "770.064"
                }
        },
        "serverInfo" : {
                "host" : "docdbinstance01",
                "port" : 27017,
                "version" : "4.0.0"
        },
        "ok" : 1,
        "operationTime" : Timestamp(1611136872, 1)
}

Để hiệu quả hơn và truy vấn bộ sưu tập nhanh nhất có thể, bạn có thể tạo một chỉ mục trường duy nhất trên trường

               },
                "name" : "_id",
                "ns" : "business.food"
        }
7. Với một chỉ mục trường duy nhất, bạn có thể lập chỉ mục trên bất kỳ trường nào trong bộ sưu tập tài liệu. Xem đoạn mã sau

rs0:PRIMARY> db.food.createIndex({"name":1},{name: "name_asc"})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611137232, 1)
}

Đi qua lệnh trước, bạn bắt đầu bằng cách chuyển các chi tiết về chỉ mục của mình

rs0:PRIMARY> db.food.createIndex({"name":1},{name: "name_asc"})

Lệnh này hướng dẫn Amazon DocumentDB tạo chỉ mục trên trường

               },
                "name" : "_id",
                "ns" : "business.food"
        }
7 theo thứ tự tăng dần (
rs0:PRIMARY> db.food.createIndex({"cuisine":1})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611136477, 1)
}
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                    "_id" : 1
                },
                "name" : "_id_",
                "ns" : "business.food"
        },
        {
                "v" : 4,
                "key" : {
                   "cuisine" : 1
        },
                "name" : "cuisine_1",
                "ns" : "business.food"
        }
]
3). Bạn có hai tùy chọn cho mẫu khóa của chỉ mục.
               },
                "name" : "_id",
                "ns" : "business.food"
        }
5 (tăng dần) hoặc
rs0:PRIMARY> db.food.createIndex({"cuisine":1})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611136477, 1)
}
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                    "_id" : 1
                },
                "name" : "_id_",
                "ns" : "business.food"
        },
        {
                "v" : 4,
                "key" : {
                   "cuisine" : 1
        },
                "name" : "cuisine_1",
                "ns" : "business.food"
        }
]
5 (giảm dần). Hướng không quan trọng đối với các chỉ mục trường đơn, nhưng nếu bạn đang thực hiện sắp xếp hoặc truy vấn phạm vi trên các chỉ mục phức hợp, hãy đảm bảo rằng hướng của bạn là chính xác. Mã này cũng chuyển tham số tên tùy chọn để đặt tên cho chỉ mục
rs0:PRIMARY> db.food.createIndex({"cuisine":1})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611136477, 1)
}
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                    "_id" : 1
                },
                "name" : "_id_",
                "ns" : "business.food"
        },
        {
                "v" : 4,
                "key" : {
                   "cuisine" : 1
        },
                "name" : "cuisine_1",
                "ns" : "business.food"
        }
]
6

Đầu ra của hoạt động

               },
                "name" : "_id",
                "ns" : "business.food"
        }
6 hiển thị các chi tiết sau

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
0

Nếu bạn tạo chỉ mục trên một bộ sưu tập không tồn tại, Amazon DocumentDB sẽ tạo bộ sưu tập như một phần của quá trình tạo chỉ mục (kết quả là

rs0:PRIMARY> db.food.createIndex({"cuisine":1})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611136477, 1)
}
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                    "_id" : 1
                },
                "name" : "_id_",
                "ns" : "business.food"
        },
        {
                "v" : 4,
                "key" : {
                   "cuisine" : 1
        },
                "name" : "cuisine_1",
                "ns" : "business.food"
        }
]
8). Trong ví dụ của chúng tôi, đây là
rs0:PRIMARY> db.food.createIndex({"cuisine":1})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611136477, 1)
}
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                    "_id" : 1
                },
                "name" : "_id_",
                "ns" : "business.food"
        },
        {
                "v" : 4,
                "key" : {
                   "cuisine" : 1
        },
                "name" : "cuisine_1",
                "ns" : "business.food"
        }
]
9 vì bộ sưu tập thực phẩm đã tồn tại

Đoạn mã sau cho biết có bao nhiêu chỉ mục tồn tại trên bộ sưu tập trước khi bạn thêm chỉ mục mới và sau khi chỉ mục mới được tạo

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
1

Khi bạn tạo một bộ sưu tập, trường

               },
                "name" : "_id",
                "ns" : "business.food"
        }
3 được lập chỉ mục tự động, do đó,
rs0:PRIMARY> db.food.find({"name":"Chefs Table at the Edgewater"}).explain("executionStats")
{
        "queryPlanner" : {
                "plannerVersion" : 1,
                "namespace" : "business.food",
                "winningPlan" : {
                        "stage" : "COLLSCAN"
                }
        },
        "executionStats" : {
                "executionSuccess" : true,
                "executionTimeMillis" : "770.505",
                "planningTimeMillis" : "0.044",
                "executionStages" : {
                        "stage" : "COLLSCAN",
                        "nReturned" : "9903",
                        "executionTimeMillisEstimate" : "770.064"
                }
        },
        "serverInfo" : {
                "host" : "docdbinstance01",
                "port" : 27017,
                "version" : "4.0.0"
        },
        "ok" : 1,
        "operationTime" : Timestamp(1611136872, 1)
}
1 của bạn là
               },
                "name" : "_id",
                "ns" : "business.food"
        }
5

Đoạn mã sau là trạng thái của hoạt động

               },
                "name" : "_id",
                "ns" : "business.food"
        }
6, cho biết nó thành công

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
2

Nếu xảy ra lỗi khi tạo chỉ mục, bạn sẽ thấy giá trị

rs0:PRIMARY> db.food.find({"name":"Chefs Table at the Edgewater"}).explain("executionStats")
{
        "queryPlanner" : {
                "plannerVersion" : 1,
                "namespace" : "business.food",
                "winningPlan" : {
                        "stage" : "COLLSCAN"
                }
        },
        "executionStats" : {
                "executionSuccess" : true,
                "executionTimeMillis" : "770.505",
                "planningTimeMillis" : "0.044",
                "executionStages" : {
                        "stage" : "COLLSCAN",
                        "nReturned" : "9903",
                        "executionTimeMillisEstimate" : "770.064"
                }
        },
        "serverInfo" : {
                "host" : "docdbinstance01",
                "port" : 27017,
                "version" : "4.0.0"
        },
        "ok" : 1,
        "operationTime" : Timestamp(1611136872, 1)
}
4 của
rs0:PRIMARY> db.food.find({"name":"Chefs Table at the Edgewater"}).explain("executionStats")
{
        "queryPlanner" : {
                "plannerVersion" : 1,
                "namespace" : "business.food",
                "winningPlan" : {
                        "stage" : "COLLSCAN"
                }
        },
        "executionStats" : {
                "executionSuccess" : true,
                "executionTimeMillis" : "770.505",
                "planningTimeMillis" : "0.044",
                "executionStages" : {
                        "stage" : "COLLSCAN",
                        "nReturned" : "9903",
                        "executionTimeMillisEstimate" : "770.064"
                }
        },
        "serverInfo" : {
                "host" : "docdbinstance01",
                "port" : 27017,
                "version" : "4.0.0"
        },
        "ok" : 1,
        "operationTime" : Timestamp(1611136872, 1)
}
5 và giá trị
rs0:PRIMARY> db.food.find({"name":"Chefs Table at the Edgewater"}).explain("executionStats")
{
        "queryPlanner" : {
                "plannerVersion" : 1,
                "namespace" : "business.food",
                "winningPlan" : {
                        "stage" : "COLLSCAN"
                }
        },
        "executionStats" : {
                "executionSuccess" : true,
                "executionTimeMillis" : "770.505",
                "planningTimeMillis" : "0.044",
                "executionStages" : {
                        "stage" : "COLLSCAN",
                        "nReturned" : "9903",
                        "executionTimeMillisEstimate" : "770.064"
                }
        },
        "serverInfo" : {
                "host" : "docdbinstance01",
                "port" : 27017,
                "version" : "4.0.0"
        },
        "ok" : 1,
        "operationTime" : Timestamp(1611136872, 1)
}
6 mà bạn có thể sử dụng để khắc phục sự cố

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
3

Nếu bạn cố gắng tạo một chỉ mục đã tồn tại, bạn sẽ nhận được thông báo tương tự như sau

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
4

Khi bạn chạy truy vấn đối với trường

               },
                "name" : "_id",
                "ns" : "business.food"
        }
7, bạn có thể thấy rằng chỉ mục mới được tạo đã được sử dụng để quét chỉ mục (
rs0:PRIMARY> db.food.find({"name":"Chefs Table at the Edgewater"}).explain("executionStats")
{
        "queryPlanner" : {
                "plannerVersion" : 1,
                "namespace" : "business.food",
                "winningPlan" : {
                        "stage" : "COLLSCAN"
                }
        },
        "executionStats" : {
                "executionSuccess" : true,
                "executionTimeMillis" : "770.505",
                "planningTimeMillis" : "0.044",
                "executionStages" : {
                        "stage" : "COLLSCAN",
                        "nReturned" : "9903",
                        "executionTimeMillisEstimate" : "770.064"
                }
        },
        "serverInfo" : {
                "host" : "docdbinstance01",
                "port" : 27017,
                "version" : "4.0.0"
        },
        "ok" : 1,
        "operationTime" : Timestamp(1611136872, 1)
}
8), cải thiện
rs0:PRIMARY> db.food.find({"name":"Chefs Table at the Edgewater"}).explain("executionStats")
{
        "queryPlanner" : {
                "plannerVersion" : 1,
                "namespace" : "business.food",
                "winningPlan" : {
                        "stage" : "COLLSCAN"
                }
        },
        "executionStats" : {
                "executionSuccess" : true,
                "executionTimeMillis" : "770.505",
                "planningTimeMillis" : "0.044",
                "executionStages" : {
                        "stage" : "COLLSCAN",
                        "nReturned" : "9903",
                        "executionTimeMillisEstimate" : "770.064"
                }
        },
        "serverInfo" : {
                "host" : "docdbinstance01",
                "port" : 27017,
                "version" : "4.0.0"
        },
        "ok" : 1,
        "operationTime" : Timestamp(1611136872, 1)
}
9 thành 9. 961

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
5

Bằng cách thêm một chỉ mục, bạn đã giảm thời gian chạy truy vấn từ 770 mili giây xuống 9. 9 mili giây

Bạn cũng có thể tạo chỉ mục trên các trường lồng nhau trong tài liệu. Ví dụ: bạn có thể muốn truy vấn nhanh trên trường

rs0:PRIMARY> db.food.createIndex({"name":1},{name: "name_asc"})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611137232, 1)
}
0 của nhà hàng, được nhúng trong trường
rs0:PRIMARY> db.food.createIndex({"name":1},{name: "name_asc"})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611137232, 1)
}
1. Xem đoạn mã sau

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
6

chỉ số hợp chất

Một chỉ mục phức hợp chứa các tham chiếu đến nhiều trường trong một cấu trúc chỉ mục duy nhất. Bạn có thể tùy chọn kết hợp các chỉ mục lồng nhau với các trường cấp cao nhất để tạo các chỉ mục phức hợp. Bạn có thể đi sâu tùy ý với các chỉ mục này (ví dụ:

rs0:PRIMARY> db.food.createIndex({"name":1},{name: "name_asc"})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611137232, 1)
}
2), nhưng sẽ bị phạt nếu đi quá sâu. Không nên đi sâu quá ba cấp độ. Các khóa riêng lẻ có thể có cùng giá trị, nhưng giá trị kết hợp trên tất cả các khóa cũng xuất hiện trong chỉ mục

Đối với bộ sưu tập của chúng tôi, chúng tôi muốn truy vấn theo cả hai trường

rs0:PRIMARY> db.food.createIndex({"cuisine":1},{name:"cuisine_asc"})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611136273, 1)
}
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "business.food"
        },
        {
                "v" : 4,
                "key" : {
                        "cuisine" : 1
                },
                "name" : "cuisine_asc",
                "ns" : "business.food"
        }
]
4 và
rs0:PRIMARY> db.food.createIndex({"name":1},{name: "name_asc"})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611137232, 1)
}
0. Tạo chỉ mục như sau

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
7

Truy vấn thực hiện quét chỉ mục trên chỉ mục mới để tìm thông tin này

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
8

Chỉ mục tổng hợp hoạt động tốt khi các trường xuất hiện cùng nhau trong các truy vấn bằng cách tăng tính chọn lọc, dẫn đến lực lượng tốt hơn so với các trường riêng lẻ. Tuy nhiên, nếu các trường được sử dụng riêng lẻ, nhiều chỉ mục có thể là lựa chọn tốt hơn. Chỉ mục hỗn hợp có thể được sử dụng trên tiền tố của khóa chỉ mục (trường đầu tiên hoặc đầu tiên của chỉ mục), nhưng các truy vấn trên trường không có tiền tố thường không sử dụng chỉ mục. Nói chung, một chỉ mục tổng hợp nhỏ hơn nhiều chỉ mục riêng lẻ

Ví dụ: trong tài liệu này, chúng tôi có một tài liệu phụ được nhúng có tên là

rs0:PRIMARY> db.food.createIndex({"name":1},{name: "name_asc"})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611137232, 1)
}
5 bao gồm dị ứng thực phẩm

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
9

Bạn tạo chỉ mục trên

rs0:PRIMARY> db.food.createIndex({"cuisine":1},{name:"cuisine_asc"})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611136273, 1)
}
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "business.food"
        },
        {
                "v" : 4,
                "key" : {
                        "cuisine" : 1
                },
                "name" : "cuisine_asc",
                "ns" : "business.food"
        }
]
4 và
rs0:PRIMARY> db.food.createIndex({"name":1},{name: "name_asc"})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611137232, 1)
}
7 (
rs0:PRIMARY> db.food.createIndex({"name":1},{name: "name_asc"})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611137232, 1)
}
8) như sau

 "v" : 4,
0

Khi bạn truy vấn trường

rs0:PRIMARY> db.food.createIndex({"cuisine":1},{name:"cuisine_asc"})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611136273, 1)
}
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "business.food"
        },
        {
                "v" : 4,
                "key" : {
                        "cuisine" : 1
                },
                "name" : "cuisine_asc",
                "ns" : "business.food"
        }
]
4, bạn có thể thấy quá trình quét chỉ mục bằng cách sử dụng chỉ mục mới

 "v" : 4,
1

Tuy nhiên, khi bạn truy vấn trên

rs0:PRIMARY> db.food.createIndex({"name":1},{name: "name_asc"})
0, Amazon DocumentDB sẽ thực hiện quét bộ sưu tập

 "v" : 4,
2

Chỉ số đa phím

Đối với các trường có giá trị mảng, chỉ mục nhiều khóa cho phép bạn tạo khóa chỉ mục cho từng phần tử trong mảng. Mảng có thể là vô hướng (chuỗi hoặc số) và tài liệu lồng nhau. Sau khi một chỉ mục được đặt thành nhiều khóa, nó không bao giờ có thể là "không có nhiều khóa" ngay cả khi tất cả các tài liệu chứa mảng đã bị xóa; . Nhiều mục nhập trong một chỉ mục nhiều khóa có thể trỏ đến một tài liệu. Điều này có thể gây ra các hình phạt về hiệu suất vì có một chút chậm trễ do quá trình loại bỏ trùng lặp xảy ra khi nhận được kết quả

Lập chỉ mục một mảng tạo một mục nhập chỉ mục cho từng phần tử của mảng. Ví dụ: nếu một mảng có 50 mục thì nó có 50 mục chỉ mục. Điều này có nghĩa là đối với một lần tạo, cập nhật hoặc xóa, mọi mục nhập mảng có thể phải được cập nhật. Lập chỉ mục một trường mảng lập chỉ mục cho từng phần tử của mảng, không phải chính mảng đó

Tài liệu của chúng tôi chứa một trường mảng,

rs0:PRIMARY> db.food.createIndex({"name":1},{name: "name_asc"})
1

 "v" : 4,
3

Bạn có thể tạo chỉ mục nhiều khóa trên

rs0:PRIMARY> db.food.createIndex({"name":1},{name: "name_asc"})
1

 "v" : 4,
4

Sau đó, bạn có thể truy vấn các phần tử của mảng

rs0:PRIMARY> db.food.createIndex({"name":1},{name: "name_asc"})
1 của mình bằng cách sử dụng chỉ mục mới này

 "v" : 4,
5

Chỉ mục đa khóa tổng hợp

Mở rộng các chỉ mục đa khóa, bạn có thể kết hợp một chỉ mục nhiều khóa với một chỉ mục khác, không phải nhiều khóa để tạo một chỉ mục nhiều khóa phức hợp. Với các chỉ mục đa khóa phức hợp, mỗi tài liệu được lập chỉ mục có thể có nhiều nhất một trường được lập chỉ mục có giá trị trong một mảng

Khi tạo chỉ mục nhiều khóa, chỉ có thể sử dụng một trường mảng. Ví dụ: tài liệu của chúng tôi chứa trường mảng cho cả

rs0:PRIMARY> db.food.createIndex({"name":1},{name: "name_asc"})
1 và
rs0:PRIMARY> db.food.createIndex({"name":1},{name: "name_asc"})
5

 "v" : 4,
6

Bạn có thể tạo một chỉ mục mới trên chuỗi

rs0:PRIMARY> db.food.createIndex({"cuisine":1},{name:"cuisine_asc"})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611136273, 1)
}
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "business.food"
        },
        {
                "v" : 4,
                "key" : {
                        "cuisine" : 1
                },
                "name" : "cuisine_asc",
                "ns" : "business.food"
        }
]
4 và mảng
rs0:PRIMARY> db.food.createIndex({"name":1},{name: "name_asc"})
1

 "v" : 4,
7

Khi bạn truy vấn trên các trường được lập chỉ mục, hãy sử dụng chỉ mục mới này

 "v" : 4,
8

Tuy nhiên, bạn không thể tạo chỉ mục trên cả hai mảng

rs0:PRIMARY> db.food.createIndex({"name":1},{name: "name_asc"})
1 và
rs0:PRIMARY> db.food.createIndex({"name":1},{name: "name_asc"})
5

 "v" : 4,
9

Điều này là để tránh số mục nhập chỉ mục theo cấp số nhân có thể là kết quả của nhiều chỉ mục đa khóa;

Nếu bạn có truy vấn cần lọc trên hai mảng, bạn có thể tạo chỉ mục nhiều khóa trên mỗi mảng và kế hoạch truy vấn sử dụng cả hai chỉ mục. Bởi vì chúng tôi đã tạo một chỉ mục trên mảng

rs0:PRIMARY> db.food.createIndex({"name":1},{name: "name_asc"})
1, trước tiên bạn có thể chạy toán tử
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
01 đối với bộ sưu tập của mình để xác thực sự tồn tại của nó

                "key" : {
                        "id" : 1
                },
0

Bây giờ bạn có thể tạo một chỉ mục nhiều khóa mới trên mảng

rs0:PRIMARY> db.food.createIndex({"name":1},{name: "name_asc"})
5

                "key" : {
                        "id" : 1
                },
1

Khi bạn truy vấn trên cả mảng

rs0:PRIMARY> db.food.createIndex({"name":1},{name: "name_asc"})
1 và mảng
rs0:PRIMARY> db.food.createIndex({"name":1},{name: "name_asc"})
5, bạn có thể thấy kế hoạch chạy truy vấn đang sử dụng cả hai chỉ mục (đầu ra bị cắt ngắn)

                "key" : {
                        "id" : 1
                },
2

chỉ số thưa thớt

Chỉ mục thưa thớt rất hữu ích khi bạn có một trường chỉ xuất hiện trong một số tài liệu chứ không phải các tài liệu khác. Khi tạo mô hình cơ sở dữ liệu tài liệu, cách tốt nhất là bỏ qua các khóa chứa giá trị null. Có một khóa có giá trị null khác với việc bỏ qua khóa hoàn toàn. Các chỉ mục duy nhất được tính là giá trị null, vì vậy bạn không thể có một chỉ mục duy nhất với nhiều hơn một tài liệu thiếu khóa đó. Chỉ mục thưa thớt bỏ qua việc lập chỉ mục các tài liệu thiếu trường, giảm kích thước chỉ mục và tiết kiệm dung lượng trong bộ nhớ. Vì kích thước chỉ mục nhỏ hơn nên các truy vấn sử dụng nó hiệu quả hơn. Để truy vấn sử dụng chỉ mục thưa thớt, nó phải bao gồm toán tử

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
05 và tham số trên trường được lập chỉ mục (điều này khác về mặt chức năng so với trong MongoDB, nơi toán tử
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
06 không bắt buộc, nhưng được hỗ trợ)

Trong bộ sưu tập của chúng tôi, trường

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
07 chỉ xuất hiện trong khoảng 1% tài liệu

                "key" : {
                        "id" : 1
                },
3

Để chỉ tạo một chỉ mục trên các tài liệu có trường

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
07, hãy chạy lệnh sau

                "key" : {
                        "id" : 1
                },
4

Để so sánh kích thước của các chỉ mục, bạn có thể chạy toán tử

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
09 đối với tập hợp. Điều này cho bạn thấy chỉ mục thưa thớt mới của
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
10 lớn như thế nào so với chỉ mục nhiều khóa của
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
11 từ ví dụ trước (đầu ra bị cắt ngắn)

                "key" : {
                        "id" : 1
                },
5

Đầu ra mặc định của

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
09 là byte. Trong ví dụ của chúng tôi, bạn chuyển qua hệ số tỷ lệ là
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
13; . Bạn cũng có thể chuyển theo hệ số tỷ lệ là
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
14 để trả về các giá trị kích thước khác nhau tính bằng kilobyte. Từ đầu ra này, bạn có thể thấy chỉ số thưa thớt mới chỉ là 1. 25 MB, nhỏ hơn 158. Chỉ mục đa khóa 61 MB

Nếu bạn chạy truy vấn của mình với toán tử

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
05, bạn có thể thấy quá trình quét chỉ mục

                "key" : {
                        "id" : 1
                },
6

Nếu bạn bỏ qua toán tử

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
05, bạn có thể thấy rằng truy vấn thực hiện quét bộ sưu tập

                "key" : {
                        "id" : 1
                },
7

chỉ số TTL

Trong một số trường hợp, bạn cần một cách linh hoạt để xóa tài liệu dựa trên độ tuổi của chúng. Chỉ mục Time to Live (TTL) cho phép bạn đặt thời gian chờ trên mỗi tài liệu. Khi một tài liệu đạt đến độ tuổi TTL được đặt, nó sẽ bị xóa khỏi bộ sưu tập. TTL hoạt động như một quy trình nỗ lực tối đa—các tài liệu không được đảm bảo sẽ bị xóa trong một khoảng thời gian cụ thể. Các yếu tố như kích thước, sử dụng tài nguyên, kích thước tài liệu, thông lượng tổng thể, số lượng chỉ mục và liệu các chỉ mục và bộ làm việc có thể vừa trong bộ nhớ hay không đều có thể ảnh hưởng đến điều này

Một điểm khác biệt quan trọng giữa chỉ mục Amazon DocumentDB TTL và chỉ mục MongoDB là MongoDB sử dụng trường

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
17 để hết hạn tài liệu. Amazon DocumentDB không hết hạn một trường trừ khi nó ở định dạng ISO 8601 hoặc một loại mảng chứa định dạng này

Bạn có thể có nhiều chỉ mục TTL trên một bộ sưu tập, nhưng chúng không thể là chỉ mục tổng hợp hoặc được sử dụng cho mục đích sắp xếp và tối ưu hóa truy vấn. Điều này có thể hữu ích để xóa dữ liệu được lưu trữ khỏi thiết bị IoT dựa trên sự kết hợp của ngày tải trọng, ngày đăng nhập hoặc ngày sự kiện. Khi sử dụng nhiều chỉ mục TTL trên một bộ sưu tập, trường đầu tiên đáp ứng tiêu chí TTL sẽ xóa tài liệu

Với các chỉ mục TTL, mỗi lần xóa sẽ phát sinh chi phí I/O—nếu tốc độ thông lượng và tốc độ xóa tăng, hóa đơn sẽ cao hơn do mức sử dụng I/O tăng. Tuy nhiên, nếu bạn không tạo chỉ mục TTL để xóa tài liệu mà thay vào đó, phân đoạn tài liệu thành các bộ sưu tập dựa trên thời gian và chỉ cần loại bỏ các bộ sưu tập đó khi chúng không còn cần thiết nữa, thì bạn sẽ không phải chịu bất kỳ chi phí I/O nào. Đối với khối lượng công việc theo chuỗi thời gian, bạn có thể cân nhắc tạo tập hợp luân phiên thay vì chỉ mục TTL vì tuyển tập luân phiên có thể là cách hiệu quả hơn để xóa dữ liệu và ít tốn công sức I/O hơn. Để biết thêm thông tin về các phương pháp hay nhất này, hãy xem

Lập chỉ mục các phương pháp hay nhất

Mặc dù các chỉ mục cải thiện hiệu suất của các truy vấn bằng cách giảm số lượng tài liệu mà cơ sở dữ liệu phải tìm kiếm để đáp ứng truy vấn, nhưng nó làm tăng dung lượng lưu trữ và IOPS cần thiết. Mỗi lần chèn, cập nhật và xóa đối với một bộ sưu tập cũng cần cập nhật chỉ mục, điều này làm chậm quá trình ghi, tăng dung lượng lưu trữ và tăng mức sử dụng bộ nhớ và IOPS. Do chi phí chung này, nên có không quá năm chỉ mục trên bộ sưu tập Amazon DocumentDB của bạn

Đối với bài đăng này, chúng tôi sử dụng thao tác

               },
                "name" : "_id",
                "ns" : "business.food"
        }
2 để xem các chỉ mục mà chúng tôi đã tạo trên bộ sưu tập của mình. Để có thêm thông tin từ chỉ mục, bạn có thể chạy truy vấn sau bằng cách sử dụng giai đoạn tổng hợp
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
19 (đầu ra bị cắt bớt)

                "key" : {
                        "id" : 1
                },
8

Bạn có thể sử dụng đầu ra này để xác định các chỉ mục không sử dụng. Các trường

               },
                "name" : "_id",
                "ns" : "business.food"
        }
7 và
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
21 cung cấp thông tin tương tự từ thao tác
               },
                "name" : "_id",
                "ns" : "business.food"
        }
2 mà chúng ta đã thảo luận trước đó. Trường
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
23 cung cấp cho bạn thông tin chi tiết về thông tin tên máy chủ của bạn để bao gồm Khu vực (chẳng hạn như
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
24). Trường
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
25 cho bạn biết số lượng thao tác đã sử dụng chỉ mục này và trường
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
26 là thời điểm Amazon DocumentDB bắt đầu thu thập số liệu thống kê cho chỉ mục (đây thường là ngày tạo chỉ mục)

Từ đầu ra trước đó, bạn thấy rằng mặc dù chỉ mục

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
11 được tạo gần đây nhất, nhưng nó đã được sử dụng nhiều lần nhất (15). Tuy nhiên, cả hai chỉ số
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
10 và
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
29 chưa bao giờ được sử dụng. Bạn có thể xóa các chỉ mục không sử dụng này bằng toán tử
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
30, chuyển qua tên chỉ mục

                "key" : {
                        "id" : 1
                },
9

Nếu di chuyển khối lượng công việc từ MongoDB sang Amazon DocumentDB, bạn nên xóa tất cả các chỉ mục không cần thiết hoặc không sử dụng trước khi di chuyển để giảm dung lượng lưu trữ đã sử dụng và giảm thời gian di chuyển. Để biết thêm thông tin về các phương pháp di chuyển, hãy xem Di chuyển sang Amazon DocumentDB

Khi chúng tôi tạo chỉ mục, chúng tôi muốn giới hạn việc tạo chỉ mục cho các trường có số lượng giá trị trùng lặp nhỏ hơn 1% tổng số tài liệu trong bộ sưu tập. Ví dụ: nếu bộ sưu tập của chúng tôi chứa 1 triệu tài liệu, chúng tôi muốn tạo chỉ mục trên các trường có cùng một giá trị xảy ra 10.000 lần hoặc ít hơn. Một ví dụ về lựa chọn trường kém sẽ là cờ trạng thái hoặc giới tính, trong đó có một tập hợp con rất nhỏ các giá trị duy nhất. Ví dụ về lựa chọn tốt hơn là trường chứa số nhận dạng, địa chỉ email hoặc tên người dùng. Chọn một chỉ mục có số lượng giá trị duy nhất cao (nghĩa là số lượng thẻ cao) đảm bảo rằng các hoạt động của bộ lọc trả về một số lượng nhỏ tài liệu, do đó mang lại hiệu suất tốt trong quá trình quét chỉ mục

Bạn cũng nên đảm bảo rằng tất cả các chỉ mục đều nằm trong bộ nhớ. Điều này giúp loại bỏ nhu cầu truy vấn tiếp cận với lớp lưu trữ, làm tăng I/O và thời gian truy vấn. Để biết chi tiết về kích thước của các chỉ mục hiện tại của bạn, hãy chạy toán tử

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
09 đối với bộ sưu tập

               },
                "name" : "_id",
                "ns" : "business.food"
        }
0

Đầu ra này cung cấp thông tin hữu ích về bộ sưu tập, chẳng hạn như tổng số tài liệu (

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
32). Đối với bài đăng này, chúng tôi tập trung vào thông tin chỉ mục

               },
                "name" : "_id",
                "ns" : "business.food"
        }
1

Bộ sưu tập có tổng cộng sáu chỉ mục, chiếm khoảng 300 MB dung lượng. Bạn cũng có thể xem thông tin kích thước cụ thể cho từng chỉ số riêng lẻ, chẳng hạn như

rs0:PRIMARY> db.food.createIndex({"cuisine":1})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1,
        "operationTime" : Timestamp(1611136477, 1)
}
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                    "_id" : 1
                },
                "name" : "_id_",
                "ns" : "business.food"
        },
        {
                "v" : 4,
                "key" : {
                   "cuisine" : 1
        },
                "name" : "cuisine_1",
                "ns" : "business.food"
        }
]
6 và
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
34. Bạn có thể sử dụng giá trị của
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
35 cùng với kích thước của bộ làm việc để giúp bạn chọn kích thước phiên bản có dung lượng bộ nhớ phù hợp cho khối lượng công việc này. Việc xác định các yêu cầu thanh lọc bộ sưu tập của bạn cũng rất quan trọng. Ví dụ: nếu bạn có một bộ sưu tập lớn chứa dữ liệu trong nhiều tuần, nhưng bạn chỉ đọc dữ liệu trong 2 ngày qua, thì kích thước chỉ mục vẫn tăng lên khi bạn thêm nhiều dữ liệu hơn và giữ lại dữ liệu cũ, điều này làm tăng yêu cầu bộ nhớ và . Bạn cần xóa dữ liệu cũ hơn, không sử dụng của mình hoặc chuyển dữ liệu đó sang bộ sưu tập khác

Ngoài ra, bạn có thể sử dụng chỉ số

rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
36 từ Amazon CloudWatch để xem tỷ lệ phần trăm yêu cầu chỉ mục đang được cung cấp từ bộ nhớ đệm của bộ đệm. Nếu con số này giảm xuống, bạn nên xem xét thay đổi quy mô phiên bản Amazon DocumentDB của mình theo chiều dọc, thay thế nó bằng một phiên bản khác chứa nhiều RAM hơn. Bạn nên giữ cho
rs0:PRIMARY> db.food.getIndexes()
[
        {
                "v" : 4,
                "key" : {
                        "id" : 1
                },
                "name" : "_id",
                "ns" : "business.food"
        }
]
36 trên 95% và tạo cảnh báo CloudWatch khi nó xuống dưới giá trị đó. Để biết thêm thông tin về các chỉ số Amazon CloudWatch cho Amazon DocumentDB, hãy xem Giám sát các chỉ số và thiết lập cảnh báo trên các cụm Amazon DocumentDB (có khả năng tương thích MongoDB) của bạn

Tóm lược

Trong bài đăng này, tôi đã xem xét các loại chỉ mục khác nhau và cách làm việc tốt nhất với chúng trong Amazon DocumentDB. Tôi đã trình bày nhiều toán tử hữu ích, chẳng hạn như tạo chỉ mục và hiển thị thông tin về kích thước và cách sử dụng chỉ mục mà bạn có thể sử dụng để giúp tối ưu hóa cụm Amazon DocumentDB của mình. Để biết thêm thông tin về cách làm việc với các chỉ mục trên Amazon DocumentDB, hãy xem

Làm cách nào để tạo chỉ mục MongoDB?

Chỉ mục có thể được tạo bằng cách sử dụng phương thức createIndex . Chỉ mục có thể được tạo trên chỉ một trường hoặc nhiều giá trị trường. Các chỉ mục có thể được tìm thấy bằng cách sử dụng phương thức getIndexes. Các chỉ mục có thể được xóa bằng cách sử dụng dropIndex cho các chỉ mục đơn lẻ hoặc dropIndexes để loại bỏ tất cả các chỉ mục.

Khi chỉ mục không tồn tại, phương thức nào sẽ được sử dụng để tạo chỉ mục?

Tạo chỉ mục. Cùng với chỉ mục mặc định, chúng ta có thể tự tạo chỉ mục bằng cách sử dụng phương thức createIndex() . Phương pháp này tạo một hoặc nhiều chỉ mục trên các bộ sưu tập được chỉ định.

Làm cách nào để kiểm tra xem chỉ mục có được tạo trong MongoDB không?

Tìm chỉ mục . Điều này sẽ trả về tất cả các chỉ mục trong một bộ sưu tập cụ thể. Kết quả. Đầu ra chứa chỉ mục _id mặc định và chỉ mục tên sinh viên do người dùng tạo chỉ mục. using the getIndexes method. This will return all the indexes in a specific collection. Result: The output contains the default _id index and the user-created index student name index.

Làm cách nào để tạo chỉ mục với TTL trong MongoDB?

Để tạo chỉ mục TTL, hãy sử dụng phương thức createIndex() trên trường có giá trị là ngày hoặc mảng chứa giá trị ngày và chỉ định tùy chọn expireAfterSeconds bằng . .