03-05-2010, 05:17
|
מנהל פורומי "תכנות ובניית אתרים" ו"חומרה ורשתות"
|
|
חבר מתאריך: 25.10.01
הודעות: 42,775
|
|
כשאתה משווה בין שתי שאילתות שבהן באחת אפשר להשתמש באינדקס ובאחת לא, ובזאת שאי אפשר, אתה משתמש ב SQL_CALC_FOUND_ROWS כדי להוכיח שהיא איטית יותר... זה קצת מצחיק... זה גם כתוב בתגובות לפוסט שהבאת.
תחשוב על זה - אם אתה היית מממש את הפונ' הנ"ל, מה בעצם היא הייתה עושה אם היא נכתבה נכון (ואנחנו צריכים להניח שהם לא סתם הוסיפו פונ' כזו אלא אם כן היא באמת משפרת כמו שהם אומרים במדריך עצמו שנתתי לינק אליו) ? סביר שהיא הייתה עושה בדיוק מה ששתי השאילתות שלך עושות, רק שהיא הייתה עושה זאת בריצה אחת - כאשר היא מספקת מידע לקליינט לפי הגבול שהתבקש, ואז ממשיכה הלאה לספור. שים לב שבדוגמא שצרפת יש שאילתא גם מאוד מאוד בנאלית; לרוב, שאילתות (ובפרט, שאילתות "דפדפוף", שבגללן משתמשים בפונ' הזו) - הן לא כאלה. יש JOIN-ים, יש GROUP BY-ים, יש WHERE-ים... בשאילתות כאלה בכל מקרה חייבים לעבור תמיד על כל הרשומות (כי אתה עושה ORDER BY וסינון, וחייבים לעבור בעצם על כל הרשומות [או האינדקס במקרה שאתה מיועל] כדי לספק ספירה נכונה ל COUNT) - ואז זה לא משנה ממש אם אתה עושה את זה עם SQL_CALC_FOUND_ROWS או אם שאילתא נוספת, למעט ה overhead הנוסף של שאילתא נוספת, "טחינה" חוזרת של ה cache (שבינתיים יכל גם להתנקות או שהטבלה יכלה להשתנות ואז צריך לעבור מחדש...) - ולכן, לסיכום, זה פשוט לא סביר שב USE CASE אמיתי, כזה שבו שתי השאילתות הן זהות, רק שבאחת יש LIMIT ובשנייה אין, ובייחוד בשאילתות "מסובכות", ש SQL_CALC_FOUND_ROWS לא יהיה מהיר יותר...
אבל אם בדקת ובמקרה שלך שתי השאילתות הזהות, ה COUNT עובד יותר מהר... (ואין לך בעייה באינדקסים)... אז וואלה, לך על זה, ונשמע שמצאת וואחד באג.
|