23-10-2010, 18:22
|
מנהל
|
|
חבר מתאריך: 26.07.08
הודעות: 6,473
|
|
כיצד בנית את האינדקסים אצלך..?
דבר ראשון - אפילו אם יש לך אינדקס על השדה x, אתה לא מנצל אותו כשהביטוי LIKE מכיל את סימן האחוז ( % ) בתחילת מחרוזת החיפוש. זה גורם ל-mysql לבצע filesort, כלומר חיפוש בטבלה כולה ללא שימוש באינדקס...
כדי לבצע חיפוש ב-200 הרשומות האחרונות יש לך 3 אופציות בהתאם לאינדקסים הזמינים:
1. אם יש לך את האינדקס הבא: (id,x), סימן שאתה יכול לבצע את החיפוש שכתבת ביעילות עם השאילתא הבאה:
קוד:
SELECT `id` FROM `table` WHERE `x` LIKE '[1]%' ORDER BY `id` DESC LIMIT 0,200
זה אמור להיות הדרך היעילה ביותר כיוון שאתה משתמש באינדקס עבור כל השאילתא - אתה לא ניגש לטבלה כדי להחזיר מידע ללקוח. (בשאילתא אתה עושה שימוש רק בטורים id ו- x שמהן האינדקס בנוי)
2. אתה יכול לעשות שימוש בשאילתא הבאה:
קוד:
SELECT `id` FROM `table` WHERE `x` LIKE '[1]%' ORDER BY `id` DESC LIMIT 0,200
כאשר יש לך את האינדקסים הבאים: (x), (id)
mysql אמור לבצע intersection עם התוצאות שהוא ייקח מכל אינדקס.
אבל אם ה-cardinality של האינדקסים (ייחודיות הערכים באינדקסים) הוא נמוך, זה גורם ל-mysql לקבל הרבה תוצאות, מה שאומר שהשאילתא לא תהיה יעילה במיוחד כמו שאולי תצפה.
3. לבצע את מה ששימי אמר ולהריץ שאילתת subquery ששולפת את 200 הרשומות האחרונות בהתאם ל-sorting שתבצע על הטור id, ומהתוצאות של השאילתא הזו תבצע חיפוש על הטור x.
-----
כדי לדעת איזו שאילתא הכי יעילה אתה חייב לבצע בדיקות...
אגב לא ברור לי למה הוספת סוגריים מרובעים ( [] ) מסביב למספרים בטור x, זה נראה לי ממש מיותר, היית יכול להשתמש בפסיקים כדי להפריד ביניהם..
|