Jump to content
php.lv forumi

SQL optimizācija (~1000 ierakstu parādīšana)


senters

Recommended Posts

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 by senters
Link to comment
Share on other sites

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.**

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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');
}

Link to comment
Share on other sites

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!

Link to comment
Share on other sites

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"

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...