| סוגי אינדקסים |
|---|
| עץ מאוזן לחיפושי שוויון, טווח וסריקות ממוינות. ברירת המחדל ברוב מסדי הנתונים. | מיועד ל- =, <, >, BETWEEN, ORDER BY. לא לחיפוש טקסט מלא. |
| אינדקס שרמת העלים שלו היא הטבלה עצמה. השורות נשמרות לפי סדר המפתח. אחד לכל טבלה. | InnoDB מקבץ לפי המפתח הראשי. טבלאות SQL Server בלי אחד כזה הן heaps. |
| מבנה נפרד שמחזיק מפתחות בתוספת מצביע חזרה לטבלת הבסיס. רבים לכל טבלה. | על heap הוא שומר מזהה שורה. על טבלה מקובצת הוא שומר את מפתח הקיבוץ. |
| טבלת גיבוב לחיפושי שוויון בלבד. התאמה מדויקת בזמן קבוע. | לשימוש רק בפעולות = ; טווחים ומיון דורשים B-tree. האש מותאם-זיכרון של SQL Server דורש bucket count קרוב למספר השורות. |
| אינדקס הפוך מוכלל. ממפה ערכים לשורות. נבנה עבור מערכים וטקסט מלא. | מיועד ל-jsonb, מערכים, tsvector וחיפוש trigram. איטי יותר לבנייה מ-B-tree. |
| עץ חיפוש מוכלל. ניתן להרחבה לטיפוסים שאינם סקלריים ולשאילתות חפיפה. | מיועד לטווחים גיאומטריים, kNN ואילוצי exclusion. pg_trgm מאיץ LIKE. |
| GiST עם חלוקת מרחב. מפצל נתונים לאזורים לא חופפים בעזרת עצי radix או quad. | מיועד לנקודות, קידומות IP והתאמת קידומות. לא לשאילתות חפיפה; השתמשו ב-GiST. |
| אינדקס טווחי בלוקים. שומר min/max לכל טווח בלוקים. טביעת רגל זעירה. | לשימוש בטבלאות גדולות וממוינות פיזית. זול לבנייה, סלקטיביות חלשה. |
| אינדקס השמור כמקטעי עמודות במקום שורות. דחיסה גבוהה, ביצוע באצווה. | מיועד לסריקות אנליטיות על שורות רבות ומעט עמודות. שליפת שורה בודדת איטית. |
| אינדקס מילים הפוך ייעודי ב-MySQL וב-SQL Server. נבנה לכל עמודת טקסט. | השתמשו ב-MATCH AGAINST או CONTAINS. הטקסט המלא של Postgres משתמש ב-GIN על tsvector במקום. |
| אינדקס של Oracle ששומר bitmap אחד לכל ערך ייחודי. כל ביט מסמן שורה אחת. | לשימוש בעמודות בעלות מיעוט ערכים ייחודיים במחסני נתונים של קריאה. כתיבות בו-זמניות מסתדרות בתור לפי bitmap. |
| עמודת אינדקס שהוגדרה DESC. מפתחות העמודה הזאת נשמרים בסדר הפוך. | נחוץ למיונים מעורבים כמו (a ASC, b DESC). מיון DESC פשוט יכול גם לקרוא אינדקס רגיל מהסוף. |
| אינדקס של MySQL 8 שהאופטימייזר מתעלם ממנו. עדיין מתוחזק בכל כתיבה. | הסתירו אינדקס לפני השמטה כדי לבדוק את ההשפעה. החזירו אותו לנראות בלי בנייה מחדש. |
| עיצוב |
|---|
| אינדקס רב-עמודתי. עמודות הפתיחה חייבות להתאים לסדר הסינון של השאילתה. | סדרו לפי שוויון קודם, ואז טווח. שני אינדקסים בודדים לא מחליפים אינדקס מורכב אחד. |
| אינדקס על פרדיקט WHERE. SQL Server קורא לזה filtered index. מכסה רק שורות תואמות. | צרו אינדקס רק על שורות active='t'. חוצה את הגודל ואת עלות הכתיבה. |
| B-tree עם עמודות שאינן מפתח מצורפות אליו. סריקות index-only חוסכות גישות אל ה-heap. | הוסיפו עמודות שנשלפות לעיתים קרובות דרך INCLUDE. שומר על האינדקס ניתן למיון. |
| אינדקס שאוסר ערכים כפולים. דוחה הוספות שמתנגשות. | מיועד למפתחות טבעיים ואילוצי one-to-one. UNIQUE NULL מתיר NULLs רבים. |
| אינדקס שנבנה על פונקציה של עמודות ולא על העמודות עצמן. | אנדקסו lower(email) או date_trunc('day', created_at). השאילתה חייבת לחזור על הביטוי המדויק. |
| מחלקת אופרטור. מגדירה כיצד אינדקס משווה ושומר את הטיפוס של עמודה. | קבעו varchar_pattern_ops עבור LIKE 'abc%' בלי התאמת רישיות. ברירות המחדל מתאימות לשוויון ולטווחים. |
| תוכנית שעונה לשאילתה מעמודי האינדקס בלבד. ה-heap לעולם לא נקרא. | דורש שכל עמודה נשלפת תהיה באינדקס או ברשימת INCLUDE. Vacuum שומר מפת נראות מעודכנת. |
| עמודות מפתח זר לא מקבלות אינדקס אוטומטי בטבלה המפנה. | אנדקסו כל עמודת FK שדרכה מצטרפים או מוחקים. מחיקות מדורגות סורקות את הטבלה הבת בלי אינדקס. |
| תחזוקה |
|---|
| בוחן תוכניות. מציג סריקות רציפות, בחירות אינדקס והערכות עלות. | השתמשו ב-EXPLAIN (ANALYZE, BUFFERS). Seq Scan על טבלה של 10 מיליון שורות סימן לאינדקס חסר. |
| דוגם עמודות טבלה כדי לבנות סטטיסטיקות לתכנן. היסטוגרמות מנחות את בחירת האינדקס. | הריצו אחרי טעינות מאסיביות. סטטיסטיקות ישנות גורמות לסריקות רציפות על עמודות מאונדקסות. |
| כל אינדקס מוסיף תקורת כתיבה. הוספות, עדכונים ומחיקות משלמים לכל אינדקס. | השמיטו אינדקסים שאינם בשימוש. עקבו אחר השימוש ב-pg_stat_user_indexes. |
| תצוגת Postgres של שימוש לפי אינדקס. סופרת סריקות ו-tuple שנקראו מאז איפוס הסטטיסטיקה. | סננו idx_scan = 0 כדי למצוא אינדקסים שאינם בשימוש. אפסו מונים עם pg_stat_reset(). |
| בונה אינדקס בלי לחסום קריאה או כתיבה. דורש שתי סריקות טבלה. | לא רץ בתוך טרנזקציה. בנייה שנכשלה משאירה אינדקס INVALID להשמטה. |
| משמיט אינדקס ומשחרר את האחסון שלו. נוטל נעילה בלעדית כברירת מחדל. | השתמשו ב-DROP INDEX CONCURRENTLY בטבלאות עמוסות. בדקו סטטיסטיקות שימוש לפני הסרה. |
| בונה מחדש אינדקס נפוח. משחזר מקום מ-tuple מתים. | השתמשו ב-REINDEX CONCURRENTLY בייצור. נעילות חוסמות כתיבה בלעדיו. |
| Tuples מתים ורווחי עמודים שמצטברים בטבלאות MVCC ובאינדקסים שלהן. | מדדו עם pgstattuple. עשו Vacuum לעיתים קרובות; REINDEX כשהמרחב המת שולט. |
| אחוז המילוי של עמוד בזמן הכתיבה. מרווח פנוי סופג עדכונים עתידיים. | הורידו ל-70-90 בטבלאות עם עדכונים חמים. עמודים מלאים כופים פיצולי עמודים. |
| כותב מחדש את הטבלה בסדר פיזי לפי אינדקס. פעולה חד-פעמית. | משתלב עם BRIN לבלוקים ממוינים. הסדר לא נשמר בכתיבות הבאות. |