Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie wykonuje się koszmarnie wolno
Forum PHP.pl > Forum > Po stronie przeglądarki > CSS
artur81
Witam!
Mam problem z zapytaniem, otóż póki było mało rekordów wszystko było ok, obecnie w jednym miejscu muszę pobrać dane z 5 innych tabel i przy 234 rekordach trwa to strasznie długo, na serwerze lokalnym: Wersja serwera MySQL: 4.0.15, Wersja php: 4.3.3, trwa to około 15-20 sekund do momentu wyświetlenia się danych w przeglądarce.
W jaki sposób można zoptymalizować to zapytanie, 2 - 3 sekundy to byłoby do zaakceptowania, ale nie 15!
Struktura bazy:
  1. Baza danych komputery uruchomiony na localhost
  2. # phpMyAdmin SQL Dump
  3. # version 2.5.3
  4. #
  5. # Host: localhost
  6. # Czas wygenerowania: 12 Maj 2006, 07:23
  7. # Wersja serwera: 4.0.15
  8. # Wersja php: 4.3.3
  9. #
  10. # Baza danych : `komputery`
  11. #
  12.  
  13. # --------------------------------------------------------
  14.  
  15. #
  16. # Struktura tabeli dla `czesci_zestawu`
  17. #
  18.  
  19. CREATE TABLE `czesci_zestawu` (
  20. `id_czesci` int(4) NOT NULL AUTO_INCREMENT,
  21. `id_kategorii` tinyint(2) DEFAULT NULL,
  22. `id_uzytkownika` int(3) DEFAULT NULL,
  23. `id_zestawu` int(4) DEFAULT NULL,
  24. `id_dostawcy` tinyint(2) DEFAULT NULL,
  25. `nazwa` char(50) DEFAULT NULL,
  26. `cena` float(5,2) DEFAULT NULL,
  27. `nr_f_vat` char(15) DEFAULT NULL,
  28. `nr_licencji` char(50) DEFAULT NULL,
  29. `data_wygasniecia` date DEFAULT NULL,
  30. `data_dostarczenia` date DEFAULT NULL,
  31. `id_statusu` tinyint(1) DEFAULT NULL,
  32. `id_rejestru_fk` char(8) DEFAULT NULL,
  33. `uwagi` char(255) DEFAULT NULL,
  34. PRIMARY KEY (`id_czesci`)
  35. ) TYPE=MyISAM AUTO_INCREMENT=235 ;
  36.  
  37. # --------------------------------------------------------
  38.  
  39. #
  40. # Struktura tabeli dla `dostawcy`
  41. #
  42.  
  43. CREATE TABLE `dostawcy` (
  44. `id_dostawcy` tinyint(2) NOT NULL AUTO_INCREMENT,
  45. `nazwa` varchar(40) DEFAULT NULL,
  46. `ulica` varchar(40) DEFAULT NULL,
  47. `miasto` varchar(25) DEFAULT NULL,
  48. `telefon` varchar(20) DEFAULT NULL,
  49. `fax` varchar(20) DEFAULT NULL,
  50. `email` varchar(30) DEFAULT NULL,
  51. PRIMARY KEY (`id_dostawcy`)
  52. ) TYPE=MyISAM AUTO_INCREMENT=2 ;
  53.  
  54. # --------------------------------------------------------
  55.  
  56. #
  57. # Struktura tabeli dla `historia`
  58. #
  59.  
  60. CREATE TABLE `historia` (
  61. `id_historia` int(11) NOT NULL AUTO_INCREMENT,
  62. `id_zestawu` int(11) DEFAULT NULL,
  63. `nazwa_czesci` char(50) NOT NULL DEFAULT '',
  64. `akcja` char(15) NOT NULL DEFAULT '',
  65. `data_zmiany` date NOT NULL DEFAULT '0000-00-00',
  66. `poprzedni_stan` char(50) NOT NULL DEFAULT '',
  67. `obecny_stan` char(50) NOT NULL DEFAULT '',
  68. PRIMARY KEY (`id_historia`)
  69. ) TYPE=MyISAM AUTO_INCREMENT=235 ;
  70.  
  71. # --------------------------------------------------------
  72.  
  73. #
  74. # Struktura tabeli dla `kategorie`
  75. #
  76.  
  77. CREATE TABLE `kategorie` (
  78. `id_kategorii` tinyint(2) NOT NULL AUTO_INCREMENT,
  79. `nazwa` char(40) NOT NULL DEFAULT '',
  80. PRIMARY KEY (`id_kategorii`)
  81. ) TYPE=MyISAM AUTO_INCREMENT=26 ;
  82.  
  83. # --------------------------------------------------------
  84.  
  85. #
  86. # Struktura tabeli dla `lic`
  87. #
  88.  
  89. CREATE TABLE `lic` (
  90. `id` tinyint(1) NOT NULL AUTO_INCREMENT,
  91. `f` char(255) NOT NULL DEFAULT '',
  92. PRIMARY KEY (`id`)
  93. ) TYPE=MyISAM AUTO_INCREMENT=2 ;
  94.  
  95. # --------------------------------------------------------
  96.  
  97. #
  98. # Struktura tabeli dla `statusy`
  99. #
  100.  
  101. CREATE TABLE `statusy` (
  102. `id_statusu` tinyint(1) NOT NULL AUTO_INCREMENT,
  103. `nazwa` char(30) DEFAULT NULL,
  104. PRIMARY KEY (`id_statusu`)
  105. ) TYPE=MyISAM AUTO_INCREMENT=6 ;
  106.  
  107. # --------------------------------------------------------
  108.  
  109. #
  110. # Struktura tabeli dla `uzytkownicy`
  111. #
  112.  
  113. CREATE TABLE `uzytkownicy` (
  114. `id_uzytkownika` int(3) NOT NULL AUTO_INCREMENT,
  115. `imie` char(30) DEFAULT NULL,
  116. `nazwisko` char(50) DEFAULT NULL,
  117. `stanowisko` char(50) DEFAULT NULL,
  118. `nr_pokoju` char(4) DEFAULT NULL,
  119. `telefon` char(20) DEFAULT NULL,
  120. `email` char(30) DEFAULT NULL,
  121. PRIMARY KEY (`id_uzytkownika`)
  122. ) TYPE=MyISAM AUTO_INCREMENT=16 ;
  123.  
  124. # --------------------------------------------------------
  125.  
  126. #
  127. # Struktura tabeli dla `zestawy`
  128. #
  129.  
  130. CREATE TABLE `zestawy` (
  131. `id_zestawu` int(3) NOT NULL AUTO_INCREMENT,
  132. `id_dostawcy` tinyint(2) DEFAULT NULL,
  133. `data_dostarczenia` date DEFAULT NULL,
  134. `cena` float(5,2) DEFAULT NULL,
  135. `nr_f_vat` char(15) DEFAULT NULL,
  136. `nr_licencji` char(50) DEFAULT NULL,
  137. `data_wygasniecia` date DEFAULT NULL,
  138. `id_statusu` tinyint(1) DEFAULT NULL,
  139. `id_rejestru_fk` char(8) DEFAULT NULL,
  140. `uwagi` char(255) DEFAULT NULL,
  141. `nazwa` char(50) DEFAULT NULL,
  142. `id_uzytkownika` int(3) DEFAULT NULL,
  143. PRIMARY KEY (`id_zestawu`)
  144. ) TYPE=MyISAM AUTO_INCREMENT=17 ;


Zapytanie:
  1. SELECT czesci_zestawu.id_czesci, kategorie.nazwa, uzytkownicy.nazwisko, uzytkownicy.imie,
  2. uzytkownicy.stanowisko, uzytkownicy.nr_pokoju, zestawy.nazwa, dostawcy.nazwa,
  3. czesci_zestawu.nazwa, czesci_zestawu.cena, czesci_zestawu.nr_f_vat, czesci_zestawu.nr_licencji,
  4. czesci_zestawu.data_wygasniecia, czesci_zestawu.data_dostarczenia, statusy.nazwa,
  5. czesci_zestawu.id_rejestru_fk, czesci_zestawu.uwagi
  6. FROM czesci_zestawu,
  7. kategorie, uzytkownicy, statusy, zestawy, dostawcy
  8. WHERE czesci_zestawu.id_kategorii = kategorie.id_kategorii AND czesci_zestawu.id_uzytkownika=uzytkownicy.id_uzytkownika AND czesci_zestawu.id_zestawu=zestawy.id_zestawu AND czesci_zestawu.id_dostawcy=dostawcy.id_dostawcy AND czesci_zestawu.id_statusu=statusy.id_statusu ORDER BY czesci_zestawu.`$co` $sort;


$co, $sort odpowiadają polu po którym sortuje i sposobie sortowania (asc, desc), przekazwyane GET

A dane wyświetlam w następujący sposób:
  1. <?php
  2.  
  3. //nagłówek tabeli
  4. while ($rekord = mysql_fetch_array ($wynik)) {
  5. $id_czesci= $rekord[0];
  6. $kategoria=$rekord[1];
  7. $nazwisko=$rekord[2];
  8. $imie=$rekord[3];
  9. $stanowisko=$rekord[4];
  10. $nr_pokoju=$rekord[5];
  11. $zestaw = $rekord[6];
  12. $dostawca=$rekord[7];
  13. $nazwa=$rekord[8];
  14. $cena=$rekord[9];
  15. $nr_f_vat=$rekord[10];
  16. $nr_licencji=$rekord[11];
  17. $data_wygasniecia=$rekord[12];
  18. $data_dostarczenia=$rekord[13];
  19. $status=$rekord[14];
  20. $id_rejestru_fk=$rekord[15];
  21. $uwagi=$rekord[16];
  22.  
  23. echo '<tr class="podswietl">
  24. <td><a href = "podzespoly_action.php?akcja=edytuj&id_czesci='.$id_czesci.'&staryzestaw='.$zestaw.'&starystatus='.$status.'"><img src="images/button_edit.png" alt="Edytuj podzespół lub oprogramowanie" title="Edytuj podzespół lub oprogramowanie"></a></td>
  25. <td><a href = "podzespoly_action.php?akcja=skasuj&id_czesci='.$id_czesci.'&staryzestaw='.$zestaw.'&starystatus='.$status.'&nazwa='.$nazwa.'"><img src="images/button_empty.png" alt="Skasuj podzespół lub oprogramowanie" title="Skasuj podzespół lub oprogramowanie"></a></td>
  26. <td align="center" class="komorka">'.$nazwa.'</td>
  27. <td align="center" class="komorka">'.$kategoria.'</td>
  28. <td align="center" class="komorka">'.$zestaw.'</td>
  29. <td align="center" class="komorka">'.$dostawca.'</td>
  30. <td align="center" class="komorka" title="'.$stanowisko.' w pokoju nr '.$nr_pokoju.'">'.$nazwisko.' '.$imie.'</td>
  31. <td align="center" class="komorka">'.$status.'</td>
  32. <td align="center" class="komorka">'.$cena.'</td>
  33. <td align="center" class="komorka">'.$nr_f_vat.'</td>
  34. <td align="center" class="komorka">'.$nr_licencji.'</td>
  35. <td align="center" class="komorka">'.$data_wygasniecia.'</td>
  36. <td align="center" class="komorka">'.$data_dostarczenia.'</td>
  37. <td align="center" class="komorka">'.$id_rejestru_fk.'</td>
  38. <td align="center" class="komorka">'.$uwagi.'</td>
  39. </tr>';
  40. // dalsza cześć skryptu  
  41. }
  42. ?>
TomASS
Jesteś pewien, że to wina zapytania? Zmierz ile trwa wykonanie zapytanie a ile prezentacja wyników.


Nie jestem na 100% pewien, ale gdybyś przerobił tak zapytanie aby zamiast "where tab1.cos=tab2.cos" było LEFT JOIN.
artur81
jak się okazało TomASS miałeś rację - to nie była wina zapytania (wykonuje się w 0,1728s). Problemem było zupełnie co innego. Skrypt z założenia miał być obsługiwany tylko pod IE 6.0. Aby nieco go pokolorować skorzystałem z behaviora csshover i podswietlałem sobie wyświetlane wiersze. Bahavior dołączałem normalnie:
Kod
body {
    background-color: #FFFFCC;
    font-family: Verdana, Arial, Helvetica, sans-serif;
    font-size: 12px;
    line-height: 24px;
    color: #336699;
    behavior:url("csshover.htc");
}

I właśnie ten behavior tak spowalniał wyświetlanie końcowej tabelki. W momencie renderowania proc obciążony był na 100%. Wyciąłem go ze styli i jak ręką odjął, razem z wyświetleniem tabeli, niecała sekunda.
TomASS
Ale swoją drogą, że behawior tak spowolaniał - dziwne.
Może spróbuj tak jak tutaj jest napisane.
artur81
dalej jest tak samo, po prostu nie działa dobrze z tym behaviorem.
nospor
No to skoro juz uzgodniliście, ze to nie wina zapytania, to przenoszę smile.gif A teraz se dyskutujcie o tym behaviorze czy jak to tam sie zwie winksmiley.jpg
FiDO
Zapytanie nadal wykonuje sie długo.. pododawaj indeksy na wszystkie pola używane do łączenia tabel (klucze obce) to zobaczysz ile powinno się ono wykonywać naprawdę.
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.