Skip to content

אינדקסים ב-SQL מוסברים

גיליון עזר על סוגי אינדקסים ב-SQL, תבניות עיצוב ותחזוקה.

אינדקסים מחליפים אחסון ומהירות כתיבה במהירות קריאה. בוחרים את המבנה, מגבילים את טווח השורות, ומנהלים את הנפיחות.

טבלת עיון · 31 ערכים
31 of 31 rows
סוגי אינדקסים
עץ מאוזן לחיפושי שוויון, טווח וסריקות ממוינות. ברירת המחדל ברוב מסדי הנתונים.מיועד ל- =, <, >, 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 לבלוקים ממוינים. הסדר לא נשמר בכתיבות הבאות.