Giới Thiệu
WiredTiger là engine lưu trữ mặc định của MongoDB, nhưng điều gì thực sự xảy ra bên trong khi các collections và indexes được lưu trữ trên đĩa? Trong bài viết này, chúng ta sẽ khám phá chi tiết về cấu trúc dữ liệu của WiredTiger, từ metadata _mdb_catalog, bố cục trang B-Tree đến cách lưu trữ BSON, các chỉ mục chính và phụ, cùng với việc xử lý mảng multikey.
Mục Lục
- Thiết lập Môi Trường
- Thí Nghiệm với MongoDB
- Bảng Catalog
- Collections và Dữ Liệu
- Chỉ Mục Chính
- Chỉ Mục Phụ
- Lời Kết
- Câu Hỏi Thường Gặp
Thiết Lập Môi Trường
Để thực hiện thí nghiệm, bạn cần thiết lập một môi trường Docker với các bước sau:
bash
docker run --rm -it --cap-add=SYS_PTRACE mongo bash
# cài đặt các gói cần thiết
apt-get update && apt-get install -y git xxd strace curl jq python3 python3-dev python3-pip python3-venv python3-pymongo python3-bson build-essential cmake gcc g++ libstdc++-12-dev libtool autoconf automake swig liblz4-dev zlib1g-dev libmemkind-dev libsnappy-dev libsodium-dev libzstd-dev
# tải về nhánh chính của WiredTiger
curl -L $(curl -s https://api.github.com/repos/wiredtiger/wiredtiger/releases/latest | jq -r '.tarball_url') -o wiredtiger.tar.gz
git clone https://github.com/wiredtiger/wiredtiger.git
cd wiredtiger
# Biên dịch
mkdir build && cmake -S /wiredtiger -B /wiredtiger/build \
-DCMAKE_C_FLAGS="-O0 -Wno-error -Wno-format-overflow -Wno-error=array-bounds -Wno-error=format-overflow -Wno-error=nonnull" \
-DHAVE_BUILTIN_EXTENSION_SNAPPY=1 \
-DCMAKE_BUILD_TYPE=Release
cmake --build /wiredtiger/build
# thêm các nhị phân `wt` và công cụ khác vào PATH
export PATH=$PATH:/wiredtiger/build:/wiredtiger/tools
# Khởi động mongodb
mongod &
Thí Nghiệm với MongoDB
Sau khi thiết lập môi trường, chúng ta tạo một collection nhỏ với ba tài liệu và một chỉ mục:
javascript
mongosh <<'JS'
db.franck.insertMany([
{_id:"aaa",val1:"xxx",val2:"yyy",val3:"zzz",msg:"hello world"},
{_id:"bbb",val1:"xxx",val2:"yyy",val3:"zzz",msg:["hello","world"]},
{_id:"ccc",val1:"xxx",val2:"yyy",val3:"zzz",msg:["hello","world","hello","again"]}
]);
db.franck.createIndex({_id:1,val1:1,val2:1,val3:1,msg:1});
db.franck.find().showRecordId();
use admin;
db.shutdownServer();
JS
Sau khi tạo collection, chúng ta dừng MongoDB để truy cập vào các tập tin WiredTiger mà không bị khóa:
bash
ls -altU /data/db
Bảng Catalog
Bảng _mdb_catalog ánh xạ tên MongoDB tới tên bảng WiredTiger. Chúng ta có thể sử dụng wt để liệt kê các key (recordId) và value (BSON):
bash
wt -h /data/db dump table:_mdb_catalog
Collections và Dữ Liệu
Bây giờ, chúng ta sẽ sử dụng tên bảng WiredTiger để dump nội dung:
bash
wt -h /data/db dump -x table:collection-0-6917019827977430149 |
wt_to_mdb_bson.py -m dump -j
Chỉ Mục Chính
Chỉ mục recordId là một khóa logic bên trong BTree để lưu trữ collection. Mỗi collection có ít nhất một chỉ mục chính trên trường "_id".
Chỉ Mục Phụ
Các chỉ mục phụ có thể bao gồm nhiều trường và có thể chứa mảng, giúp tạo ra nhiều mục chỉ mục cho một tài liệu, giống như một chỉ mục đảo ngược.
Kinh Nghiệm Tốt Nhất
- Sử dụng chỉ mục cho các trường thường xuyên được truy vấn để cải thiện hiệu suất truy vấn.
- Tránh tạo quá nhiều chỉ mục trên một collection để giảm thiểu overhead.
Cạm Bẫy Thường Gặp
- Không sử dụng chỉ mục cho các trường có giá trị duy nhất.
- Không cập nhật chỉ mục sau khi đã xóa trường.
Lời Kết
Bằng cách khám phá các tệp WiredTiger, chúng ta có thể thấy rõ cách các collections và indexes được lưu trữ trên đĩa. Từ đó, chúng ta có thể tối ưu hóa hiệu suất cho ứng dụng của mình.
Câu Hỏi Thường Gặp
-
WiredTiger là gì?
WiredTiger là engine lưu trữ mặc định của MongoDB, cung cấp hiệu suất và khả năng tối ưu hóa cho việc lưu trữ dữ liệu. -
Tại sao nên sử dụng chỉ mục?
Chỉ mục giúp tăng tốc độ truy vấn dữ liệu bằng cách giảm thiểu số lượng tài liệu cần quét. -
Có những loại chỉ mục nào trong MongoDB?
MongoDB hỗ trợ chỉ mục chính, chỉ mục phụ và chỉ mục multikey cho các trường có mảng.
Khuyến Nghị
Để tìm hiểu thêm về MongoDB và cách tối ưu hóa hiệu suất, hãy tham khảo tài liệu chính thức của MongoDB và các khóa học online.