01-08-2014, 09:54
|
מנהל פורומי "תכנות ובניית אתרים" ו"חומרה ורשתות"
|
|
חבר מתאריך: 25.10.01
הודעות: 42,775
|
|
זה תמיד היה לא חוקי.
זה לא משנה מה יש בפנים - אתה לא צריך לקבל את השורות בפועל אם כל מטרתך היא לספור כמה מהן יש. זה דורש הכנת כל המידע ושליחתו ממסד הנתונים אל האפליקציה שלך (PHP) ואז עבודה של PHP לספור את הרשומות. והמון הקצאות ושחרורי זיכרון מיותרים לשם כך. כשאתה עושה (COUNT(1, מסד הנתונים פשוט מקדם מונה עבור כל שורה שהוא מצא, ובסוף מחזיר את המונה. כלומר מספר בודד, במקום בעצם כל תוכן מסד הנתונים שלך.
אין לך אינדקסים במסד הנתונים בכלל (למעט המפתח העיקרי, שהוא אינדקס אוטומטי). אתה תצטרך ליצור. יש לך עוד בעייה שאתה מפר את כללי הנורמליזציה, ואז החיפושים שאתה מבצע הם לפי מחרוזות במקום לפי מספר. צריכות להיות טבלאות נפרדות של כל הנתונים שהם חוזרים בין השורות - כמו שם של עיר, סטטוסים, ובכל טבלה יהיה הטקסט וה id, ואצלך יהיה רק רפרנס ל id הזה. החיפושים האלה, גם הם הרבה יותר מהירים, וזה גם מקטין את נפח הטבלה שלך כי אתה לא כותב שם אותו מידע שוב ושוב בכל שורה (מה שבעצמו מאיץ את העבודה). קרא כאן: http://en.wikipedia.org/wiki/Database_normalization
עדיין צריך פלטים של EXPLAIN על שאילתות איטיות כדי לדעת מה גומר אצלך את כל הזמן (ולקוות שיש כמה עיקריים)... גם הלולאות יכולות להיות אשמות, כיוון שאם אתה מריץ הרבה מהן וכל אחת לוקחת קצת זמן, בסוף זה מצטבר. כאמור אתה צריך לנסות לשאוף לשלוף את המידע בלי השאילתות האלה. מהסתכלות בפלט הסופי שלך (אך מבלי להכיר בדיוק את תוכן המידע שלך) - באופן תאורטי, נשמע לי שאפשר היה לעשות את כל זה אפילו עם שאילתא אחת???
לגבי מה זה אינדקס: http://he.wikipedia.org/wiki/%D7%90...%D7%A9%D7%91%29
אני אתן לך את הכיוון שלדעתי אתה צריך ללכת אליו:
המטרה שלך (כפי שאני מבין אותה) היא לסכום את כל אחד מהמספרים ברמת השאילתא, ולעשות את זה פר מוסד.
אם אני מבין נכון את הפלט שלך, יש מוסדות בערים שונות, וממשק המשתמש שלך מאפשר להציג כל עיר ולראות את רכיביה.
בפועל זה אומר שאם תשלוף את רשימת כל המוסדות (כשלצד כל מוסד, העיר שלו) - ועבור כל מוסד תקבל את סך הרישום/משלמים לקיטנה/צהרון (על ידי (COUNT(1 של GROUP BY בתוך תתי השאילתא עבור כל שדה) - תקבל בפועל ממסד הנתונים טבלה שמכילה את כל נתונים הטבלה שלך, רק בלי הסיכומים של הערים. את הטבלה הזו אתה תמיין עוד בשלב מסד הנתונים עם ORDER BY לפי שדה העיר (ואולי לפי שדה העיר ואז שדה המוסד, אם חשוב לך המיון א-ב בפנים), והתוצאה תהיה מערך דו מימדי שמכיל את כל הנתונים על כל המוסדות - ללא חלוקה לערים שאותה אתה מממש היום, למיטב הבנתי, באמצעות הלולאה. כיוון שאתה רוצה את כל הנתונים, אז פילטור כל אחת מהערים בנפרד רק כדי לקבל בסוף את כולן, גם הוא מיותר.
הנ"ל יהיה מעט מאוד מידע. מה שישאר לך לעשות, בצד האפליקציה, זה לרוץ על כל התוצאות, ולפזר את זה למערך תלת-מימדי שראשו הוא מזהה העיר. אחרי זה תוכל לרוץ עם foreach על המערך, ועבור כל עיר, לרנדר את ה HTML שאתה רואה היום. ת'אכלס לא באמת חייבים את המערך התלת מימדי באמצע, אתה תוכל לרנדר ישירות מהתוצאות, אבל זה אומר שאתה תצטרך להבין מתי לייצר את הכותרות של כל עיר (רמז: כשהרשומה הנוכחית היא בעלת עיר שונה מהעיר הקודמת שרינדרת). הבחירה בידך...
|