MySQL: איטיות בפעולות LIMIT גדולות | Slow large Limit offsets

1 בפברואר 2011

2 תגובות

(הפוסט רלוונטי במידה מסויימת גם ל-SQL Server)
בעבר הדגמתי כיצד ניתן לבצע חלוקה לדפים ביעילות בMySQL וב-SQL Server, גם כשהטבלאות עליהן עובדים הולכות ומתנפחות.

נתקלתי לא אחת במקרה בו הגולש (או המקרה הנפוץ יותר – מנוע חיפוש), מתחיל לרוץ על הדפים ומגיע לדף ה-1000 ויותר.
במקרה כזה, מסד הנתונים צריך לעבור על כל הטבלה עד לשלב שאליו הוא הגיע. פעולה יקרה, איטית וזוללת משאבים
תרשו לי להציע פיתרון אחר.

ניקח לדוגמא את השליפה הזו:

– Source Query – slow on large LIMIT

select f_id, f_title, f_date from flashes where  f_visible=1 order by f_date desc limit 10000,10

במערכת עמוסה, הפעולה הזו תיתקע. הפתרון המוצא הוא להוסיף אינדקס על השדות המתאימים (f_date, f_id), ולשלוף אותם בנפרד.

– Faster queries:

select f_id  from flashes where f_visible=1 and f_date <= now() order by f_date desc  limit 10000,10

ואחר כך

select f_id, f_title,  f_date from flashes where f_id in (" & s & ")  order by f_date desc 

כש – s הוא פשוט רשימת מספרים מופרדים בפסיקים – 1,3,4,5,6.

ומה באשר ל-SQL Server – העניין לא שונה בהרבה. גם שם עניין ה-Covering Index מסייע משמעותית וניתן לעבוד באותה הצורה, גם בהיעדרו של LIMIT.

שימוש יעיל!

 

The solution: add a covering index on (f_date, f_id),

This make the first query to be fast, because it is Index-only opreation (and on a correct configuration – memory only). The second is simple just look on Primary Key, with the list of IDs from the first.

The variable "s" from the second query need to be the list of IDs with commas, like "1,2,56,8,4".

הוסף תגובה
facebook linkedin twitter email

כתיבת תגובה

האימייל לא יוצג באתר. שדות החובה מסומנים *

2 תגובות

  1. Pini Dayan2 בפברואר 2011 ב 12:02

    תגיד , עם איזה כלי חינמי אתה ממליץ לעבוד עם mysql בתור ה managment studio שלו?

    הגב
  2. משה2 בפברואר 2011 ב 14:34

    MySQL Workbench

    יש לה המון שגעונות בהתחלה, אבל גם לא מעט כח. אני מצאתי אותה כמאוד נוחה לשימוש.

    אמנם לא התעמקתי ב-SQL Server Managment Studio, אבל נראה שהם העתיקו משם הרבה רכיבים, ואת האחרים ביצעו אחרת.

    הגב