15-10-2005, 21:46
|
|
|
|
חבר מתאריך: 15.10.05
הודעות: 3
|
|
בעיית ביצועים בשאילתת SQL על מסד נתונים MySQL
יש לי שתי טבלאות תכנים, נקרא להם: father & son, כדי שהקשרים בינהן יהיו ברורים.
טבלה נוספת היא טבלת המועדפים, שכל גולש יכול לבחור להוסיף רשומה מתוך הטבלאות הנ"ל למועדפים שלו. היא נראית ככה:
+-------+-----------+--+
| ID|| fatherid|sonid|
+-------+-----------+--+
אני רוצה לשלוף את כל הרשומות מ Son שהיוזר נרשם אליהן, כולל רשומות שמשורשרות תחת father שיש להן sons.
הנה השאילתה ליוזר מספר 90:
קוד:
SELECT
son.id, son.name,father.id, father.name,favorites.id
FROM son
INNER JOIN favorites ON(favorites.sonid=son.id OR favorites.father=father.id )
INNER JOIN father ON son.parentid=father.id
WHERE favorites.userid=90 ORDER BY sons.date DESC
השאילתא עובדת ונותנת תוצאות נכונות. הבעיה כשבודקים את הריצה שלה רואים את הדבר הבא:
קוד:
|id|select_type|table |type |possible_keys |key |key_len|ref |rows| Extra |
+--+-----------+---------+------+----------------+-------+-------+------------+----+--------------------------------------------+
|1 |SIMPLE |favorites|index |userid |userid |4 |NULL |4 |Using index; Using temporary; Using filesort|
|1 |SIMPLE |son |ALL |PRIMARY,parentid|NULL |NULL |NULL |464 |Using where |
|1 |SIMPLE |father |eq_ref|PRIMARY |PRIMARY|4 |son.parentid|1 | |
(לא הצלחתי לשים טבלה נורמלית )
בכל מקרה, מה שלומדים מהטבלה של explain, שהטבלה sons נשלפת כולה לטבלה זמנית ואין שימוש באינדקסים (הקיימים). השאילתא הזו אמורה להיות יעילה מכיוון שיהיה בה שימוש רב.
יש למישהו מושג איך לגשת לבעיה הזו? אולי כיוון אחר?
|