Indexing - B-Trees, Hash Indexes, Composite Indexes
production server, שעה 2 בלילה. Alert מ-Datadog: p99 latency על /api/orders קפץ מ-80ms ל-12 שניות. DBA מתחבר, מריץ pg_stat_activity - רואה עשרות queries תקועות על orders table שגדלה ל-50 מיליון שורות. EXPLAIN ANALYZE מראה: Seq Scan. Full table scan על 50 מיליון שורות, כל query.
הוספת index אחד:
CREATE INDEX CONCURRENTLY idx_orders_user_status
ON orders(user_id, status)
WHERE status != 'delivered';זמן: 4 דקות לבנות. תוצאה: latency חזר ל-80ms. 4 דקות של index building מול שעה של incident וכאב ראש של כולם.
Indexes הם הדבר הבודד שיש לו הכי הרבה impact על performance ב-relational database. והם לרוב גם הדבר שנשכח.
הסיפור הזה חוזר בחברות שונות. Yelp כתבו על incident ב-2019 שבו query שרץ מהר על tables קטנות פתאום נהיה איטי כשה-table גדלה.
מה שמאפיין incidents של "missing index" הוא שהם invisible בפיתוח. ב-development environment יש 1,000 records - כל query מהיר. בproduction אחרי שנה יש 50 מיליון records - פתאום הכל איטי. אין שינוי בקוד. הbug "נוצר" בדרישות ה-scale, לא בקוד. זה מה שהופך performance testing על production-size data לחובה, לא רשות.
ה-discipline הנדרש הוא פשוט: בכל פעם שמוסיפים Foreign Key, מוסיפים גם index. בכל פעם שכותבים query חדש עם WHERE על column שמוחזר הרבה, בודקים אם יש index. ב-development, מריצים EXPLAIN ANALYZE על כל query חשוב ובודקים שיש Index Scan ולא Seq Scan. זה לא עבודה קשה - זה habits שחוסכים incidents.
דוגמה ממשית: חברת SaaS ישראלית עם 50 לקוחות ב-year one ו-5,000 ב-year three. ה-query שבודק "כמה subscriptions פעילות יש ל-tenant X" רץ ב-2ms בyear one. בyear three, עם 2 מיליון records ב-subscriptions table ובלי index על tenant_id: אותו query = 4 שניות. ה-load על dashboard שנפתח אלפי פעמים ביום = database load שמחנק הכל. Index אחד פתר את הבעיה, אבל ה-incident קרה כי אף אחד לא בדק את ה-query plan על data בגודל production. הbug לא היה בקוד - ה-code לא השתנה. הbug היה שה-table גדלה מעבר ל-threshold שבו PostgreSQL מחליט לעשות Seq Scan במקום Index Scan. הפתרון היה גם הוספת index. אבל הlecture הגדולה יותר: performance tests שנעשים על data קטן לא מספרים את הסיפור על production עם מיליוני שורות. תמיד בדקו על data בגודל production.