Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL]Optymalizacja kodu
Forum PHP.pl > Forum > Przedszkole
lukas22333
Witam, napisałem taki kod, wiem że nie jest za bardzo optymalny( i chce to zmienić ) ale na chwilę obecną działa. Próbowałem coś tam zmieniać ale coś nie wychodzi.

Pierwotna wersja:
CODE

<?
$sql_1 = 'SELECT type, name FROM menu';
$result = mysql_query($sql_1) or die(mysql_error());
$ile=mysql_num_rows($result);
if ($ile>0 && ($result)) {

while ($r=mysql_fetch_assoc($result))
{
echo ''."\n";
echo ''.$r['name'].''."\n";

$sql_2 = 'SELECT txt_id, alias FROM txt WHERE menid="'.$r['type'].'"';
$result_1 = mysql_query($sql_2) or die(mysql_error());

$sql_3 = 'SELECT anchor, adres FROM menu_links WHERE type="'.$r['type'].'"';
$result_3 = mysql_query($sql_3) or die(mysql_error());

while ($r1=mysql_fetch_assoc($result_1))
{
echo '» '.$r1['alias'].''."\n";
while ($r2=mysql_fetch_assoc($result_3))
{
echo '» '.$r2['anchor'].'.'."\n";
}
}

echo ''."\n";
}

}
?>



A teraz moje wypociny:

CODE

<?
$result = mysql_query('SELECT type, name FROM menu') or die(mysql_error());
if ($result) {

while ($r=mysql_fetch_assoc($result))
{
echo ''."\n";
echo ''.$r['name'].''."\n";

$result_1 = mysql_query('SELECT txt.txt_id, txt.menid, txt.alias, menu_links.anchor, menu_links.adres, menu_links.type FROM txt LEFT JOIN menu_links ON (txt.menid=menu_links.type) WHERE txt.menid="'.$r['type'].'" AND menu_links.type="'.$r['type'].'"') or die(mysql_error());


while ($r1=mysql_fetch_assoc($result_1))
{
echo '» '.$r1['alias'].''."\n";
while ($r2=mysql_fetch_assoc($result_1))
{
echo '» '.$r2['menu_links.anchor'].'.'."\n";
}
}

echo ''."\n";
}

}
?>


Podejrzewam, że nie tak jest albo te łączone zapytanie albo dwie pętle po nim.

Pozdrawiam
Zmorcia
  1. <?php
  2. $result = mysql_query('SELECT type, name FROM menu') or die(mysql_error());
  3.  
  4. if ($result) {
  5.       while ($r=mysql_fetch_array($result))
  6.        {  
  7.                  echo '\n';
  8.          echo $r['name'].'\n';
  9.          
  10. $result_1 = mysql_query('SELECT txt.txt_id, txt.menid, txt.alias, menu_links.anchor, menu_links.adres, menu_links.type FROM txt LEFT JOIN menu_links ON (txt.menid=menu_links.type) WHERE txt.menid=\"'.$r['type'].'\" AND menu_links.type=\"'.$r['type'].'\"') or die(mysql_error());
  11.      
  12.           while ($r1=mysql_fetch_array($result_1))
  13.           {
  14.          echo 'ť '.$r1['alias'].'\n';
  15.                while ($r2=mysql_fetch_array($result_1))
  16.                {
  17.                echo 'ť '.$r2['menu_links.anchor'].'\n';
  18.                }
  19.           }
  20.         echo '\n';
  21.             }
  22.    }
  23. ?>


// jaki błąd ci wywalało?
lukas22333
Nikt nie wie jak to skrocic ? sad.gif Tak by było 1 zapytanie.
CODE
while ($r=mysql_fetch_assoc($result))
{
echo ''."\n";
echo ''.$r['name'].''."\n";

$sql_2 = 'SELECT txt_id, alias FROM txt WHERE menid="'.$r['type'].'"';
$result_1 = mysql_query($sql_2) or die(mysql_error());

$sql_3 = 'SELECT anchor, adres FROM menu_links WHERE type="'.$r['type'].'"';
$result_3 = mysql_query($sql_3) or die(mysql_error());

while ($r1=mysql_fetch_assoc($result_1))
{
echo '» '.$r1['alias'].''."\n";
while ($r2=mysql_fetch_assoc($result_3))
{
echo '» '.$r2['anchor'].'.'."\n";
}
}

echo ''."\n";
}


up..
Riklaunim
Nie zawsze 1 zapytanie jest lepsze. Stosowanie JOINów może wydawać się ładne i takie "pro", ale dość często przy większym obciążeniu zapytania takie mogą mocno obciążać bazę danych.
lukas22333
To co w tej pierwotnej wersji proponujesz zminienic? zamiast tych zapytań.
pinochet
Cytat(Riklaunim @ 22.12.2008, 22:20:08 ) *
Nie zawsze 1 zapytanie jest lepsze.
Prosiłbym o przykład.

  1. SELECT
  2. txt.txt_id,
  3. txt.menid,
  4. txt.alias,
  5. menu_links.anchor,
  6. menu_links.adres,
  7. menu_links.type
  8. FROM txt, menu_links, menu
  9. WHERE txt.menid=menu_links.type AND txt.menid=menu.type

To tak na oko.
Nie chce mi sie na podstawie kodu rozkminiac twojej struktury bazy danych ale stosowanie relacji 1-1 a potem łączenie tabel aby zrobić SELECT-a jest raczej mało optymalne.
nexik
nie wykonuj kolejnych zapytan w petli, lepiej zrob sobie tablice ktora bedzie przechowywac kolejne slowniki a w petli tylko korzystaj z zmiennych php a nie operuj na zapytaniach sql
lukas22333
Cytat(nexik @ 23.12.2008, 17:59:04 ) *
nie wykonuj kolejnych zapytan w petli, lepiej zrob sobie tablice ktora bedzie przechowywac kolejne slowniki a w petli tylko korzystaj z zmiennych php a nie operuj na zapytaniach sql


Mozesz jasniej? bo nie bardzo rozumie. Jakis przyklad.

@up
pinochet
według mnie to powinno działać szybciej:
  1. <?
  2. $sql_1 = 'SELECT `txt`.`alias`, `menu`.`name`             FROM `txt`, `menu`             WHERE `txt`.`menid`=`menu`.`type` ORDER BY `menu`.`type` ';
  3. $sql_2 = 'SELECT `menu_links`.`anchor`, `menu`.`name`     FROM `menu_links`, `menu`     WHERE `menu_links`.`type`=`menu`.`type` ORDER BY `menu`.`type`';
  4. $result1 = mysql_query($sql_1) or die(mysql_error());
  5. $result2 = mysql_query($sql_2) or die(mysql_error());
  6.  
  7.  
  8. while ($r=mysql_fetch_assoc($result1)){
  9.    $aliasy[$r['name']][] = $r['alias'];
  10. }
  11.  
  12. while ($r=mysql_fetch_assoc($result2)){
  13.    $submenu[$r['name']] .= 'ť '.$r['anchor'].".\n";
  14. }
  15.  
  16. echo "\n";
  17.  
  18. foreach($menu as $nazwa => $aliasy){
  19.    echo $nazwa."\n\n";
  20.    foreach($aliasy as $jeden){
  21.        echo 'ť '.$jeden."\n";
  22.        echo $submenu[$nazwa];
  23.    }
  24. }
  25.  
  26. echo "\n";
  27. }
  28. ?>

Fajna łamigłówka biggrin.gif
lukas22333
Warning: Invalid argument supplied for foreach() in ...... on line 18 worriedsmiley.gif

Linijka 18 to ta:

CODE
foreach($menu as $nazwa => $aliasy){



A kod lamiglowka bo nie wiem jak to inaczej by zrobic tongue.gif
pinochet
oczywiscie nie $menu tylko $aliasy
Astarot
Dobry czlowieku:

Poznaj skladnie PHP
Nastpenie Poznaj Skladnie MySQL


Pytania z ktorymi wyskakujesz sa tak oczywiste i banalne, ze az mi za Ciebie wstyd!

Pozatym, nigdzie nie widze, zadnego mechanizmu cachowania...

chcesz zeby bylo optymalnie zasanow sie kiedy trzeba sie odwolowac do bazy danych, tabele mazwales memu badz podobnie a takie dane powinny byc statyczne anyway: imo, z tych strzepow informacji ktore uzyskalem wydaje mi sie ze baza jest zaprojekowana zle! Wklej caly kod tabli pokaz zaptania, napisz jaki masz cel i czego oczekujesz, poradzimy cos wiecej!
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.