بازگشت به کتابخانهکتابخانه12.1موتور ذخیره‌سازی: B+Tree در برابر LSM
طراحی سیستم نرم‌افزاریSYSTEM DESIGNاز صفر تا تسلط
v1.0.0
01مبانی و تصویر بزرگ
02Scalability و ظرفیت
03لایه داده
04Cache، Queue و جریان
05معماری نرم‌افزار
06قابلیت اطمینان و عملیات
07متد طراحی
08Case Study های واقعی
09سیستم‌های توزیع‌شده عمیق
10مهندسی تولید: داده، امنیت و کارایی
11تمرین پیشرفته و کیس‌استادی‌های مکمل
12زیر کاپوت دیتابیس و معماری داده
13وب بلادرنگ و پروتکل‌های مدرن
14سیستم‌های توزیع‌شده پیشرفته
15SaaS ،SRE ،امنیت و شبکه پیشرفته
16طراحی سیستم در عصر AI
17Case Study های تکمیلی
LESSON 12.1فصل ۱۲زیر کاپوت دیتابیس و معماری داده

موتور ذخیره‌سازی: B+Tree در برابر LSM

  • ~۱۵ دقیقه
  • ۴ پرسش
  • متن را انتخاب کن تا هایلایت شود

تا حالا دیتابیس را جعبه‌ای می‌دانستیم که کوئری می‌خورد و جواب می‌دهد. اما انتخاب بین «نوشتن-سریع» و «خواندن-سریع» از خودِ موتور ذخیره‌سازی می‌آید: B+Tree (قلب Postgres و InnoDB) در‌جا به‌روزرسانی می‌کند و برای خواندن بازه‌ای عالی است؛ LSM-Tree (قلب Cassandra ،RocksDB و LevelDB) همه‌چیز را append می‌کند و برای نوشتن سنگین ساخته شده است.

B+Tree: صفحات مرتب، به‌روزرسانی در‌جا

  • داده در صفحات (Page) مرتبِ معمولاً 4KB تا 16KB نگه داشته می‌شود؛ درختِ کم‌عمق (۳-۴ سطح برای میلیاردها سطر) جستجو را به چند خواندن دیسک می‌رساند.
  • UPDATE یعنی یافتن صفحه و تغییر همان‌جا؛ اگر صفحه پر شود، split لازم است — نوشتن تصادفی روی دیسک.
  • قبل از نوشتن روی صفحه، تغییر در WAL (Write-Ahead Log) ذخیره می‌شود تا crash داده را نبرد: اول لاگ، بعد صفحه.
  • خواندن بازه‌ای (BETWEEN ،ORDER BY) به‌خاطر ترتیب فیزیکی صفحات بسیار ارزان است.

LSM-Tree: هیچ‌چیز را در‌جا عوض نکن

DIAGRAMمسیر نوشتن در LSM
Write
WAL — دوام
Memtable — RAM مرتب
Flush → SSTable غیرقابل‌تغییر
Compaction
  • نوشتن فقط به WAL + یک ساختار مرتب در RAM (Memtable) است — به همین دلیل نوشتن وحشتناک سریع است؛ همه‌چیز sequential.
  • وقتی Memtable پر شد، به‌صورت SSTable غیرقابل‌تغییر روی دیسک ریخته می‌شود؛ UPDATE و DELETE هم فقط رکورد جدید (با tombstone) هستند.
  • خواندن باید Memtable و چند SSTable را بگردد — به همین دلیل LSM کنار هر SSTable از Bloom Filter (فصل ۱۰) استفاده می‌کند تا سراغ فایل بی‌ربط نرود.
  • Compaction پس‌زمینه SSTable ها را ادغام و نسخه‌های قدیمی را دور می‌ریزد؛ دو سبک: Size-Tiered (نوشتن‌محور) و Leveled (خواندن‌محور).

تقابل اصلی: چه چیزی را می‌دهی، چه می‌گیری

B+TreeLSM-Tree
مدلبه‌روزرسانی در‌جاAppend-only + ادغام پس‌زمینه
نوشتنتصادفی روی دیسک؛ کندتر در نوشتن سنگینSequential؛ چند برابر سریع‌تر
خواندن بازه‌ایعالی — ترتیب فیزیکی حفظ استباید چند فایل merge شود؛ کندتر
فضاپراکندگی صفحات (fragmentation)Write amplification در compaction؛ نیازمند فضای موقت
نمونهPostgreSQL ،MySQL (InnoDB)Cassandra ،RocksDB ،LevelDB ،ScyllaDB

به زبان ساده

دیتابیس‌ها دو مکتب ذخیره‌سازی دارند: B+Tree برای خواندن سریعِ تک‌رکوردی و LSM برای نوشتن سیلابی؛ انتخاب موتور یعنی انتخاب همین مصالحه.

مثال واقعی

دفتر حسابداری B+Tree مثل کارتابل مرتب است که سریع هر نام را پیدا می‌کنی؛ LSM مثل دفترچه یادداشت روزانه است که سریع آخرش می‌نویسی و آخر هفته مرتبش می‌کنی.

دانش‌سنجی

آزمون درس

۴ Q
01
چرا نوشتن در LSM-Tree از B+Tree سریع‌تر است؟
02
نقش WAL در هر دو موتور چیست؟
03
برای جدول لاگ رویداد با میلیاردها insert در روز و کوئری ساده روی کلید، کدام موتور منطقی‌تر است؟
04
Compaction در LSM چه مشکلی را حل و چه مشکلی را می‌سازد؟