אינדקסים ב SQL
-
בגלל שSQL זה טכנולוגיה בוגרת ועדיין רלוונטית, זה נושא שיש עליו המון חומר גם בעברית,
אני מביא לך כמה לינקים רלוונטיים לשאלה:
http://blogs.microsoft.co.il/gerireshef/2010/11/29/אינדקסים-וספריית-אוניברסיטת-חיפה/
https://internet-israel.com/מדריכים/mysql-מדריכים/אופטימיזציה-בסיסית-של-mysql/
http://www.softwarearchiblog.com/2018/08/mysql-storage-engines.html -
-
תודה רבה!
-
הקישור הראשון זה תאוריה יותר, שכבר קראתי הרבה...
הקישור השני זה נחמד, את רוב הכללים כבר ידעתי, אבל הוא חידש לי כמה דברים.
הקישור השלישי נשמע לי עמוק מידי, מה גם שאני לא יודע אם זה תקף ל MSSQL. -
אני מחפש סיכום קצר ולעניין, מתי להשתמש באינדקס, איזה שדות לכלול וכו'.
לדוגמה: האם צריך לכלול שדה של תנאי? ושדה של מיון? וכדו'.
אמנם דברים פשוטים, אך אני לא בקי בהם
-
-
@WWW הלינק הראשון הכי חשוב וכל השאר מיותר.
עם קצת מחשבה תבין לבד את כל הכללים.
אין שום הבדל בין MSSQL ובין MYSQL ברמת התיאוריה, וברמה המעשית זה פרטים שוליים שלא נתקלים בהם כל יום.המשפט: "מתי להשתמש באינדקס, איזה שדות לכלול וכו'." מחייב שלא הבנת או לא קישרת היטב את התיאוריה למעשה, כי זה אמור להיות פשוט.
את השאלה של שדה תנאי ומין לא הבנתי, מה זה שדה תנאי? ושדה מיון? -
אוי @dovid מה אני אגיד לך...
לא כולם חכמים כמוך...
אין לי כח לעשות פה לומדות ולהבין דבר מתוך דבר, וזה לא בא לי בקלותבכל מקרה, אני מחפש יותר כללים יבשים (כמו 'שדה שמסננים אותו הרבה חייבים לכלול באינדקס', וכדו').
וכן הדרכה מעשית על MSSQL, איך עושים את זה.שדה תנאי התכוונתי לשדה שבד"כ מסננים לפי זה.
ושדה מיון התכוונתי שדה שבד"כ ממיינים את התוצאות לפי השדה הזה (טקסט). -
@WWW בקשר לשדה תנאי ומיון, בטוח לשניהם צריך לעשות.
מתי לעשות ומה?
בגדול,כל שדה/קבוצת שדות, שממיינים או מסננים על פיהם לעיתים קרובות, והחיפוש/מיון בו מתבסס על מתחיל ב נגמר ב וק"ו שווה ל, כדאי לעשות אינדקס.
קבוצת שדות הכונה למשל שבפעמים שמחפשים/מסננים על פיהם כל הקבוצה תופיע בתנאי או במיון.אני בכל אופן הרצתי חיפוש באינטרנט "sql index rule of thumb"
אנשים מציינים את הדברים הבאים:- בד"כ אינדקס נותן תועלת משמעותית רק כשמתשאלים 1. אחוז קטן מהתוצאות (10% ופחות מגודל הטבלה) 2. הטבלה גדולה מאוד 3. יש שונות גבוהה בערכים המאונדקסים (למשל זכר נקבה זה שתי ערכים אז זו שונות נמוכה מאוד מאוד).
- לא ליצור אינדקס אם לא נראית או צפויה בעיה (כלומר קודם שיהיה לאט ואז נדבר - אז גם אפשר לבדוק מייד אם הייתה התייעלות)
- הכתיבות לטבלה וסבלים מביצועים נמוכים ככל שיש יותר אינדקסים. במיוחד יש לשקול זאת בטבלה עם ריבוי כתיבות.
מכל זה קל להבין שבלתי אפשרי שיהיה כללים יבשים וקלים.
המלצה טובה זה לעשות לוג לשאילתות ולבדוק מה לקוח הכי הרבה זמן, ולנסות לשחק. -
@dovid תודה רבה, לזה חיכיתי!
כעת לשאלה שלי:
- יש לי טבלה שאמורה להיות כבדה, נגיד 50,000 רשומות, ועיקר האפליקציה זה קריאה מהטבלה הזאת.
יש בטבלה כ 15 שדות. - עדכון לטבלה מתבצע רק ע"י המנהל, וזה בד"כ בעיקר הוספה של הרבה רשומות בבת אחת (ע"י סקריפט שמכניס אחד אחרי השני לאחר בדיקה).
- כמעט תמיד השאילתא תריץ תנאי ששדה 'א' (INT) שווה X. וזה אמור לשלוף כ 3000 רשומות בתנאי הזה (לרוב השאילתה מוגבלת ל TOP 100 רשימות, אבל הבנתי שזה לא עוזר כלום).
- לרוב המיון יהיה לפי ביטוי מורכב (זו שאלה בפנ"ע אם זה כדאי) שזה ['שם משפחה' + ' ' + 'שם פרטי'].
- אני נותן אופציה ללקוח למיין לפי כל שדה בטבלה, וכן לסנן לפי כל שדה כולל סינון מקונן (בד"כ הסינון 'שווה').
- בינתיים אין אינדקסים (חוץ ממפתח ראשי) ואני לא רואה איטיות (יש כ3000 רשומות כרגע בטבלה).
מה היית ממליץ לעשות?
- יש לי טבלה שאמורה להיות כבדה, נגיד 50,000 רשומות, ועיקר האפליקציה זה קריאה מהטבלה הזאת.