מתי להגדיר אינדקס במסד נתונים
-
איך לדעת על איזה שדות כדאי להגדיר אינדקס? אני משתמש בmysql.
האם זה שדות שאני מפעיל עליהם תנאי WHERE פעמים רבות או מעטות?
(ואם כן, אז האם גם שדה בוליאני שאני מאחזר את כל הרשומות מלבד הלא פעילות, גם צריך אינדקס?)אשמח למידע
(יש לי מסד נתונים קיים שהתחיל לגדול, והבנתי שכדאי לי למטב אותו בשביל לייעל את הביצועים) -
@מוטי-מן אני לא יודע אם יש בזה כללים ברורים,
אבל אני עושה אינדקס בד"כ על שדות שאני משתמש בהם הרבה בLEFT JOIN, ORDER, GROUP וכמובן WHERE, אני לא עושה את זה תמיד, אלא רק שדות שמשמשים בכמה שאילתות שמתבצעות בתדירות,
להבנתי אם תגדיר יותר מידי אינדקסים זה אומנם עשוי לשפר את מהירות שליפת הנתונים, אבל יאט את קצב הקליטה של נתונים חדשים (האינדקס מתעדכן בכל פעם שאתה מוסיף נתונים),
לגבי אינדקסים על שדות בוליאנים, אני לא יודע,
-
יש תורה שלימה שאי אפשר למסור על רגל אחת (גם אם הייתי מכיר את זה היטב)
הכלל הבסיסי הוא שכדאי לאנדקס במקרה שאינדקס יגרום לחסכון גדול בשיעור הקריאה מהדיסק שהמסד צריך כדי לענות על השאילתה
המקרה הקלאסי הוא כאשר בלי אינדקס המסד יצטרך לעבור על כל הטבלה כדי לענות על השאלה, ועם אינדקס הוא יצטרך קריאה של רק אחוז קטן מהטבלה
למשל, שאילתה על טבלה גדולה שמחזירה רק שורות מועטות מתוך הטבלה על ידי סינון עמודה
דוגמאות למקרים שלא צריכים אינדקס:- שאילתה שמחזירה את רוב שורות הטבלה (גם עם אינדקס אתה בכל מקרה קורא את רוב הטבלה)
- שאילתה שמחזירה כמה שורות לפי מפתח ראשי עם
WHERE
על עמודה נוספת (גם בלי אינדקס על העמודה המסננת, שליפת שורה לפי מפתח ראשי הוא מהיר)
אני ממליץ בשלב הזה לטפל נקודתית בשאילתות שאתה רואה שהם איטיים, ולבדוק אם אפשר לשפר אותם על ידי אינדקס ולא סתם לחפש ליצור אינדקסים
לפעמים AI מצליח לענות תשובה נכונה אם אתה שואל אותו "איזה אינדקס כדאי לעשות לשפר את הביצועים של שאילתה זו" -
לגבי אינדקס על שדה בוליאני: זה כדאי רק במקרה שהסינון על העמודה יחזיר רק מיעוט מהשורות (רוב המוחלט של השורות הוא true או false) וכדאי לאנדקס רק השורות עם הערך הפחות נפוץ (true או false), דהיינו להוסיף where לפקודה של יצירת האינדקס
עיין https://stackoverflow.com/a/42972924