עבור לתוכן

PHP + MySQL - שליפה יעילה של רשומות רנדומליות מטבלה

Featured Replies

פורסם

הי,

אני צריך לבצע שליפה מה-DB של בערך +100 רשומות רנדומליות מה-DB. אני לא מומחה גדול ל- SQL אבל אני יודע שהשאילתא שהיום אני מבצע היא לא הכי יעילה.

SELECT * FROM TABLE ORDER BY RAND() LIMIT 200

בנתיים זה עובד סבבה כי אין לי הרבה רשומות (20), אבל הטבלה אמורה לגדול לכמה אלפים טובים לפחות.

בטבלה יש עמודה של IDs שהיא AUTO_INCREMENT והיא Primary Key.

לפי מה שאני מבין יש לי 2 אופציות.

1. לבצע שאילתא יעילה יותר - אולי תוכלו להפנות אותי לאחת כזו. ראיתי פה כמה http://akinas.com/pages/en/blog/mysql_random_row/ אבל הם כל פעם שולפים רשומה אחת, וכשניסיתי להגדיל את הטווח זה לא החזיר לי מספר קבוע של ערכים.

2. לבצע שליפה כדי לברר את מספר הרשומות הקיימות. ב-PHP לחולל 100+ מספרים רנדומלים בין 1-למספר הרשומות הקיימות. ולבצע שליפה לפי ה-IDs הרנדומליים שחוללתי. (אפשרות זו דורשת 2 שליפות מה-DB)

מספר העמודות בטבלה הוא 14.

תודה!

פורסם

היי

אני לא כל כך מכיר טוב MYSQL אבל אני מכיר טוב אורקל - אז אולי זה בכל זאת יעזור.

כשעושים שליפה באורקל ללא שום ORDER BY, אז הרשומות חוזרות בסדר אקראי לחלוטין. אם גם ב MYSQL זה ככה אז אתה צריך רק להגביל ל limit 200 ללא המיון (order by) שהוא החלק הכבד בשאילתה.

אם MYSQL לא מתנהג ככה אז תצטרך לחכות לתשובה של מישהו אחר. אין בעיה להריץ את השאילתה ללא ORDER BY כמה פעמים ולראות אם הרשומות חוזרות תמיד באותו סדר או לא.

פורסם
  • מחבר

תודה אבל זה לא עובד :\

עדיין מחכה לתשובה..

פורסם

לאפשרות 2 תוכל לכתוב STORED PROCEDURE שיחסוך את הפנייה הנוספת לDB (בהנחה שזו פנייה מרוחקת)

אבל, ישנה בעייה עם הפתרון הזה (2) אם אתה מוחק שורה מהטבלה.

כיוון קצת אחר הוא להכין מראש (CRON) את הDATA נניח כל דקה - ואז משתמשים לא יאלצו לחכות שה SQL יחזור.

פורסם
  • מחבר

האמת שה-DB הוא DB מקומי.

אז אם זה המצב לבצע 2 קריאות ל-DB זה לא נורא?

אני לא בטוח שזה באמת יהיה שווה ליצור Stored Procedure.

תודה!

פורסם

האמת שה-DB הוא DB מקומי.

אז אם זה המצב לבצע 2 קריאות ל-DB זה לא נורא?

אני לא בטוח שזה באמת יהיה שווה ליצור Stored Procedure.

תודה!

רעיון:

אם אתה רוצה לדעת מה יהיה בעתיד מבחינת ביצועים ומה יותר טוב לך, מה שאני תמיד עושה זה ממלא טבלה זמנית באמצעות סקריפט בשאני יוצר, בהרבה מאוד רשומות (אלפים\עשרות אלפים) ואז עושה benchmark על כל אחת מהאופציות. ככה לא תצטרך להסתמך על השערות לגבי הביצועים שתקבל. הייתי הולך על אופציה 2 שלך אם זה לא יגרום להורדת הביצועים באופן ניכר.

ארכיון

דיון זה הועבר לארכיון ולא ניתן להוסיף בו תגובות חדשות.

דיונים חדשים