25-06-2010, 17:00
|
|
|
חבר מתאריך: 06.05.04
הודעות: 297
|
|
יש עוד אפשרות הרבה יותר מהירה מהשאר,
בתגובה להודעה מספר 1 שנכתבה על ידי emanuel שמתחילה ב "ביצועים לשני אפשרויות להוצאת מידע מSELECT מרובה תוצאות"
האשכול הזה עשה לי קצת חשק לחקור את הנושא, יש מספר אופציות,
האופציה הראשונה היא להשתמש בmysqli_query בצורה רגילה, ולקבל את כול הresult set אל תוך המשתנה, המגרעות של זה היא שכמות המידע שתשתמש זה כמות הזיכרון שינוצל, מה שאומר שאם אתה יושב על שרת שהmemory_limit שלו זה 64MB (שאני מודע לכך שזה יכול ליהיות המון תוכן) אתה פשוט תיהיה נורא מוגבל במידה מסויימת.
האופציה השניה היא להשתמש עם Reference בדיוק כמו שהחבר שלך אמר, ההבדלים הם לא משמעותיים בכלל, שניה לפה שניה לשם, והזמן איכשהו נורא דינאמי כשעובדים על מעט נתונים, אז זה באמת לא הכי שימושי.
האופציה השלישית היא להשתמש בUnbufferd Queries, המטרה היא לשלוח שאילתא לMySQL ולא לקבל את הresult set עד שלא נבקש אותו, הייתרונות של זה זה חסכון בשימוש של RAM, אתה להשתמש בשאילתות ולעבוד עם התוצאות שלהן רק מתי שאתה צריך, הרבה יותר מהר מהאופציות שהזכרתי למעלה, החסרונות שלו הם די בעייתיים למי שמריץ אפליקציה שהנגישות לטבלה צריכה ליהיות ממספר Processes שונים, כי ברגע ששלחתם UnBufferd Query לטבלה הטבלה ננעלת אוטומאטית למצב של Read Only ולא תוכלו לבצע בה שינויים(הגיוני לגמרי, אנחנו הרי שולפים Result Set שמעודכן לשניה מסויימם) אולי אפשר להגדיר בMySQL לבטל את הנעילה הזאת אם לא אכפת לנו כמה הנתונים מעודכנים, בכו"א זה החסרון היחידי שיש, אתם צריכים לחשוב על זה טיפה יותר במה אתם צריכים להשתמש, במידה ולא בא לכם להסתבר עם הנושא מומלץ להשתמש בmysqli_query.
עכשיו קצת Benchים
קוד PHP:
<?php function microtime_float() { list($usec, $sec) = explode(" ", microtime()); return ((float)$usec + (float)$sec); }
$connection = mysqli_connect('localhost','root','','rest_compare ');
$start = microtime_float();
$query = mysqli_query($connection, "SELECT * FROM `cities`"); $i = 0;
while ($row = mysqli_fetch_array($query, MYSQLI_ASSOC)) { ++$i; }
$end = microtime_float() - $start; printf('%d Rows With No Reference In %f Time<br />', $i, $end);
mysqli_free_result($query);
$start = microtime_float();
$query =& mysqli_query($connection, "SELECT * FROM `cities`"); $i = 0;
while ($row = mysqli_fetch_array($query, MYSQLI_ASSOC)) { ++$i; }
$end = microtime_float() - $start; printf('%d Rows With Reference In %f Time<br />', $i, $end);
mysqli_free_result($query);
$start = microtime_float();
$query = mysqli_real_query($connection, "SELECT * FROM `cities`"); $i = 0;
if ($result = mysqli_use_result($connection)){ while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) { ++$i; } } $end = microtime_float() - $start; printf('%d Rows With Unbufferd Query In %f Time', $i, $end);
mysqli_free_result($result); ?>
התוצאה שאני קיבלתי על 37K תוצאות היא:
קוד:
37000 Rows With No Reference In 0.361479 Time
37000 Rows With Reference In 0.359125 Time
37000 Rows With Unbufferd Query In 0.239853 Time
|