senters Posted December 7, 2011 Report Share Posted December 7, 2011 (edited) Ir nopietna performances problēma ar MySQL kveriju. Ir sadaļa - visi notikumi, kurā pēc xml importa, tiek ielādēti +/- 1000 notikumi, kuru parādīšana lapā, smagi iebremzē (ielāde aptuveni 40s). Ja šo pašu kveriju izpildu pa taisno SQL, tas izpildās zem ~0.6s. $sql = mysql_query(" SELECT UNIX_TIMESTAMP(event.date_start) AS date_echo, event.*, city.id AS city_id, city.name AS city_name, user.name AS user_name, user.surname AS user_surname FROM event LEFT JOIN city ON event.city_id = city.id LEFT JOIN user ON event.user_id = user.id WHERE event.date_start >= '".$today_date."' ORDER BY event.date_start "); while($event = mysql_fetch_assoc($sql)) { $sql2 = mysql_query(" SELECT favorite.id, favorite.event_id, favorite.user_id FROM favorite LEFT JOIN event ON favorite.event_id = event.id WHERE favorite.user_id = '".$_SESSION['uid']."' AND event.id = '".$event['id']."' "); $favorits = mysql_fetch_array($sql2); $event['fav_event_id'] = $favorits['event_id']; $event['fav_user_id'] = $favorits['user_id']; include('inc/sql_event.php'); } Kādi būtu ieteikumi, kā panākt lapā lai ielādē tik pat ātri, katrā ziņā lai tās nebūtu ~40 sekundes? Tabulu neesmu indeksējis, jo nav pilnīgas sapratnes par to kā pareizi jāindeksē. Tabulas struktūra - http://screencast.com/t/hUwZybgZm Edited December 7, 2011 by senters Quote Link to comment Share on other sites More sharing options...
daGrevis Posted December 7, 2011 Report Share Posted December 7, 2011 Nu saproti taču, ka tur ir cikls. Tur neizpildās viens kverijs, bet tik daudz kveriji, cik daudz ierakstu atgriež pirmais kverijs, plus, pats primais kverijs. **40 sekundes.** Quote Link to comment Share on other sites More sharing options...
NBS Posted December 7, 2011 Report Share Posted December 7, 2011 Kpc cikliski jāpilda viens un tāds pats sql, kuram ir padots cits `event` un `sessijas_id` ? Nav vienkāršāk izveidot vienu lielu selektu, kas izpildās un pēc tam apstrādāt rezultātu ar php ? Kā, piemēram, visu rezultātu sastumt masīvā un apstrādāt to, kas strādās daudz reizes ātrāk un pieprasījums izpildīsies aptuveni 1-2sec. Quote Link to comment Share on other sites More sharing options...
senters Posted December 7, 2011 Author Report Share Posted December 7, 2011 Noņemot pavisam nost 2. ciklu ar 2. selectu, nekas nemainas. $sql = mysql_query(" SELECT UNIX_TIMESTAMP(event.date_start) AS date_echo, event.*, city.id AS city_id, city.name AS city_name, user.name AS user_name, user.surname AS user_surname FROM event LEFT JOIN city ON event.city_id = city.id LEFT JOIN user ON event.user_id = user.id WHERE event.date_start >= '".$today_date."' ORDER BY event.date_start "); while($event = mysql_fetch_assoc($sql)) { include('inc/sql_event.php'); } Quote Link to comment Share on other sites More sharing options...
daGrevis Posted December 7, 2011 Report Share Posted December 7, 2011 Kas atrodas inklūdotajā failā? Tikai nesaki, ka vēl viens kverijs. :D Quote Link to comment Share on other sites More sharing options...
senters Posted December 7, 2011 Author Report Share Posted December 7, 2011 Inclūdē sql_event.php: http://pastie.org/2980773 Quote Link to comment Share on other sites More sharing options...
codez Posted December 7, 2011 Report Share Posted December 7, 2011 ir indeksi uz event.date_start, city.id, user.id? Quote Link to comment Share on other sites More sharing options...
senters Posted December 7, 2011 Author Report Share Posted December 7, 2011 (edited) codez, šeit tabulas "event" struktūra -> http://screencast.com/t/nfurA9j2XOd Edited December 7, 2011 by senters Quote Link to comment Share on other sites More sharing options...
codez Posted December 7, 2011 Report Share Posted December 7, 2011 izskatās, ka nav indexa uz event.date_start un otrs, tālāk inklūdotais fails izskatās, ka izmanto 1 eventu, bet tu selekto veselu sarakstu. Tam ir kāda dziļāka jēga? Quote Link to comment Share on other sites More sharing options...
daGrevis Posted December 7, 2011 Report Share Posted December 7, 2011 Failā, kas tiek inklūdots **iekš cikla**, ir divi kveriji. Jēzus! :D Quote Link to comment Share on other sites More sharing options...
senters Posted December 7, 2011 Author Report Share Posted December 7, 2011 Sadaļā tiek parādīti visi aktīvie eventi no db, tādēļ arī tiek noselektēti visi un while ciklā izvadīts pats pasākuma bloks (sql_event.php) ar pasākuma info. Visu pasākumu sadaļu veido ~1000 šādi eventi. Quote Link to comment Share on other sites More sharing options...
senters Posted December 7, 2011 Author Report Share Posted December 7, 2011 daGrevis, ieliekot sql_event.php failā satura vietā -> echo "xxx"; rezultāts tika atgriezts momentā. Jāskatās, kas tieši tur bremzē. Quote Link to comment Share on other sites More sharing options...
daGrevis Posted December 7, 2011 Report Share Posted December 7, 2011 Jebkurā gadījumā; daudz kveriji nekad nav bijuši laba parādība. Pastāsti ko tu vēlies panākt - vēlreiz; iedod visus tabubulu struktūrum kur dati, ko tev vajag iegūt, glabājās. Kopā izdomāsim! Quote Link to comment Share on other sites More sharing options...
senters Posted December 7, 2011 Author Report Share Posted December 7, 2011 Mēģināšu sql_event.php inklūdi pēc iespējas vairāk novienkāršot izņetm apakšselektus. Informēšu par progresu. Quote Link to comment Share on other sites More sharing options...
Kaklz Posted December 7, 2011 Report Share Posted December 7, 2011 Iznes ārpus cikla tos abus SQL: Šim nav nekāda sakara ar eventu sarakstu, bet tas tiek 1000x izpildīts viena pieprasījuma laikā $sql_level = mysql_query("SELECT level FROM user WHERE id = '".$_SESSION['uid']."'"); LIST($level) = mysql_fetch_row($sql_level); Šo mierīgi var nedarīt ciklā, bet ārpusē ar vienu query un attiecīgi atkal stāsts par ~1000 query mazāk. // Komentāru skaits pasākumam (pāsakumu sarakstos) $sql_comment = mysql_query("SELECT COUNT(*) FROM comment WHERE event_id = '".$event['id']."'"); Nesaistīti ar SQL: katrā IF zarā šos visus pārdefinēt ir vājprāts. Tos, kas nemainās nodefinē vienreiz un IF konstrukcijās maini tikai tos, kas mainās. if ($m == "all") { $del_show_icon = "style=''"; $del_icon_class = "event_del"; $del_div_name = "follow_del"; $del_show_icon2 = "style='display: none'"; $del_icon_class2= ""; $del_div_name2 = "remove_del"; } else { $del_show_icon = "style=''"; $del_icon_class = ""; $del_div_name = "remove_del"; $del_show_icon2 = "style='display:none'"; $del_icon_class2= "event_del"; $del_div_name2 = "follow_del"; } } else { $show_icon = "style='display:none'"; $icon_class = "event_favactive"; $div_name = "remove"; $show_icon2 = "style='display:none'"; $icon_class2= "event_fav"; $div_name2 = "follow" Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.