MongoDB - Tối ưu hóa Indexing

Xin chào các bạn đam mê cơ sở dữ liệu! Hôm nay, chúng ta sẽ cùng khám phá thế giới thú vị của việc tối ưu hóa indexing trong MongoDB. Đừng lo lắng nếu bạn mới bắt đầu học lập trình; tôi sẽ hướng dẫn bạn từng khái niệm một cách chi tiết, như tôi đã làm cho hàng trăm sinh viên trong những năm dạy học của mình. Hãy lấy một ly đồ uống yêu thích của bạn, và cùng bắt đầu hành trình này nhé!

MongoDB - Advanced Indexing

Indexing các Trường Mảng

Hãy tưởng tượng bạn đang tổ chức một thư viện khổng lồ. Bạn có rất nhiều kệ sách, nhưng làm thế nào để bạn nhanh chóng tìm thấy cuốn sách bạn muốn? Đó là lúc indexing phát huy tác dụng. Trong MongoDB, việc indexing các trường mảng giống như tạo một danh mục đặc biệt cho sách có nhiều tác giả hoặc thể loại.

Indexing Mảng Cơ Bản

Hãy bắt đầu với một ví dụ đơn giản. Giả sử chúng ta có một bộ sưu tập sách, và mỗi cuốn sách có thể có nhiều tác giả.

db.books.insertMany([
{ title: "The Great Adventure", authors: ["John Doe", "Jane Smith"] },
{ title: "Mystery Island", authors: ["Jane Smith"] },
{ title: "Cooking Masterclass", authors: ["Chef Gordon", "Chef Julia"] }
])

Để tạo một index trên trường mảng authors, chúng ta sử dụng:

db.books.createIndex({ authors: 1 })

Index này cho phép chúng ta nhanh chóng tìm kiếm sách theo bất kỳ tác giả nào. Hãy thử một truy vấn:

db.books.find({ authors: "Jane Smith" })

Truy vấn này sẽ hiệu quả trả về cả "The Great Adventure" và "Mystery Island" vì Jane Smith là tác giả của cả hai cuốn sách.

Multikey Indexes

cái chúng ta vừa tạo là một multikey index. MongoDB tự động tạo loại index này khi bạn index một trường mảng. Nó giống như tạo một mục lục riêng cho từng tác giả của từng cuốn sách.

Indexing các Mảng Nhúng

Bây giờ, hãy làm cho nó phức tạp hơn một chút. Giả sử chúng ta muốn index sách theo các chương của nó?

db.books.insertOne({
title: "Learn MongoDB",
chapters: [
{ number: 1, title: "Introduction", pages: 20 },
{ number: 2, title: "Basic CRUD Operations", pages: 30 },
{ number: 3, title: "Indexing", pages: 25 }
]
})

Chúng ta có thể tạo một index trên tiêu đề của các chương:

db.books.createIndex({ "chapters.title": 1 })

Điều này cho phép chúng ta nhanh chóng tìm kiếm sách theo tiêu đề của các chương:

db.books.find({ "chapters.title": "Indexing" })

Indexing các Trường Con Văn Bản

Indexing các trường con văn bản giống như tạo một danh mục cho sách dựa trên thông tin chi tiết của chúng. Nó rất hữu ích khi bạn có các cấu trúc dữ liệu phức tạp, nhúng.

Indexing Con Văn Bản Cơ Bản

Hãy xem xét một bộ sưu tập sinh viên với thông tin địa chỉ:

db.students.insertMany([
{
name: "Alice",
address: { city: "New York", zipcode: "10001" }
},
{
name: "Bob",
address: { city: "Los Angeles", zipcode: "90001" }
}
])

Để tạo một index trên trường city trong văn bản con address:

db.students.createIndex({ "address.city": 1 })

Bây giờ chúng ta có thể hiệu quả tìm kiếm sinh viên theo thành phố:

db.students.find({ "address.city": "New York" })

Indexes Hợp

Đôi khi, chúng ta muốn index nhiều trường trong một văn bản con. Giả sử chúng ta thường xuyên tìm kiếm sinh viên theo cả thành phố và mã bưu điện:

db.students.createIndex({ "address.city": 1, "address.zipcode": 1 })

Index hợp này cho phép các truy vấn hiệu quả như:

db.students.find({ "address.city": "New York", "address.zipcode": "10001" })

Indexing các Mảng Nhúng

Bây giờ, hãy đối mặt với một tình huống thách thức hơn. Hãy tưởng tượng chúng ta có một bộ sưu tập trường học, mỗi trường có nhiều lớp, và mỗi lớp có nhiều học sinh:

db.schools.insertOne({
name: "Sunshine Elementary",
classes: [
{
name: "Class 1A",
students: [
{ name: "Alice", grade: "A" },
{ name: "Bob", grade: "B" }
]
},
{
name: "Class 1B",
students: [
{ name: "Charlie", grade: "A" },
{ name: "David", grade: "C" }
]
}
]
})

Để index điểm số của học sinh trên tất cả các lớp:

db.schools.createIndex({ "classes.students.grade": 1 })

Điều này cho phép các truy vấn hiệu quả như tìm kiếm tất cả các trường có học sinh điểm "A":

db.schools.find({ "classes.students.grade": "A" })

Kỹ Thuật Indexing Nâng Cao

Hãy kết thúc với bảng tóm tắt một số kỹ thuật indexing nâng cao mà chúng ta đã xem xét và một số kỹ thuật khác:

Kỹ Thuật Mô Tả Ví Dụ
Multikey Index Tự động tạo cho các trường mảng db.books.createIndex({ authors: 1 })
Index Hợp Index trên nhiều trường db.students.createIndex({ "address.city": 1, "address.zipcode": 1 })
Index Văn Bản Cho phép truy vấn tìm kiếm văn bản db.articles.createIndex({ content: "text" })
Index Băm Index băm giá trị của trường db.users.createIndex({ username: "hashed" })
Index T通用 Index động các trường khớp với mẫu xác định db.products.createIndex({ "details.$**": 1 })

Nhớ nhé, các bạn học sinh, indexing là một công cụ mạnh mẽ, nhưng nó đi kèm với chi phí. Mỗi index chiếm không gian và làm chậm các thao tác ghi. Nó giống như thêm nhiều mục lục vào thư viện của chúng ta - hữu ích cho việc tìm sách, nhưng mất thời gian để cập nhật chúng khi có sách mới đến.

Khi chúng ta kết thúc bài học này, tôi nhớ lại một sinh viên đã từng hỏi, "Giáo sư, chẳng phải indexing chỉ như tạo một tờ gian lận cho bài kiểm tra?" Và bạn biết đấy, đó không phải là một so sánh tồi! Indexes giống như tờ gian lận cho cơ sở dữ liệu của bạn, giúp nó nhanh chóng tìm thấy thông tin cần thiết.

Hãy tiếp tục thực hành, giữ vững sự tò mò, và chúc các bạn thành công trong việc indexing!

Credits: Image by storyset