SQLite تو پروداکشن؛ درسهای یه پروژهٔ واقعی
خلاصهٔ کاملتر
نویسنده میگه برای یه سایت جنگویی سراغ SQLite رفته و مثل خیلیها اول کلی پست خونده که استفاده از SQLite تو پروداکشن برای سایتهای کوچیک کاملاً قابل قبوله — و به نظرش هم واقعاً هست. ولی چیزی که کامل درکش نکرده بود اینه که SQLite بالاخره یه دیتابیسه، دیتابیسها پیچیدهن و اداره کردنشون دانش خودشو میخواد. این چهارمین سایتیه که روی SQLite بالا آورده و به گفتهٔ خودش سختتر از قبلیهاست، چون با ORM جنگو خیلی بیشتر کار رو انداخته گردن دیتابیس.
اولین و مهمترین درس، دستور ANALYZE بوده. یه کوئری جستوجوی متن کامل با FTS5 روی جدولی با فقط ۴۰۰۰ ردیف، ۵ ثانیه طول میکشیده. بعد از اجرای ANALYZE همون کوئری به حدود ۰٫۰۵ ثانیه رسیده. این دستور آمار جدولها رو میسازه تا برنامهریز کوئری انتخابهای بهتری بکنه، و نویسنده حدس میزنه قبلش با یه رفتار تصادفاً درجهدو طرف بوده.
درس دوم دربارهٔ پاکسازی رکوردهای اضافیه و زنجیرهٔ خرابی جالبی داره: دستور پاکسازی بیشتر از ۵ ثانیه طول میکشه، یه ورکر دیگه همون موقع میخواد بنویسه، بعد از تایماوت ۵ ثانیهای شکست میخوره، کرش میکنه و ماشین مجازی خاموش میشه. راهحل فعلیش اینه که پاکسازی رو تیکهتیکه و تو دستههای کوچیک انجام بده تا هیچ کوئریای از اون آستانه رد نشه.
همین تجربه باعث شده بیشتر بفهمه چرا یه نفر ممکنه یه دیتابیس «واقعی» مثل پستگرس بخواد که بیشتر از یک نویسندهٔ همزمان رو تحمل میکنه. گزینهٔ دیگهای هم که تو ذهنشه، اعلام یه بازهٔ تعمیر برنامهریزیشده برای این جور کارهاست که هنوز روال مشخصی براش پیدا نکرده.
برای پشتیبانگیری دو راه رو امتحان کرده. اولی یه اسنپشات کامله که با VACUUM INTO یه کپی تمیز میسازه و بعد فشرده و آپلود میشه:
sqlite3 /data/calendar.db "VACUUM INTO '/tmp/calendar.sqlite'"
gzip /tmp/calendar.sqliteروش دوم Litestream هست که پشتیبانگیری افزایشی انجام میده. دلیل مهاجرتش هم این بوده که بکاپهای کامل گاهی به خاطر مصرف حافظه کشته میشدن. راستش رو هم میگه: هیچوقت بازیابی از بکاپ رو تست نکرده، فقط با یه سوییچ مرد-مرده مانیتورشون میکنه — که خودش تذکر خوبی برای بقیهست.
آخرین ترفند اینه که لازم نیست همهٔ جدولها تو یه فایل باشن. تو یکی از پروژههای قبلیش جدولها رو بین سه فایل دیتابیس جدا پخش کرده و به نظرش کمک کرده؛ همون پروژه هم چهار ساله روی SQLite میچرخه و مهاجرت از پستگرس بهش انتخاب درستی بوده.
نکات کلیدی:
- ANALYZE میتونه یه کوئری کند رو با ساختن آمار برای برنامهریز کوئری، دهها برابر سریع کنه
- حذف دستههای بزرگ رکورد، نویسندههای دیگه رو تایماوت میکنه؛ کار رو تیکهتیکه کنید
- تکنویسنده بودن SQLite همونجاییه که آدم دلش پستگرس میخواد
- دو مسیر بکاپ: اسنپشات با VACUUM INTO یا پشتیبانگیری افزایشی با Litestream
- تست نکردن بازیابی بکاپ یه ریسک واقعیه، حتی وقتی مانیتورینگ داری
- میشه جدولها رو بین چند فایل دیتابیس مستقل تقسیم کرد




