Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zapytanie wykonuje się koszmarnie wolno
artur81
post
Post #1





Grupa: Zarejestrowani
Postów: 252
Pomógł: 2
Dołączył: 4.12.2004
Skąd: Skierniewice

Ostrzeżenie: (10%)
X----


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. ?>
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 6)
TomASS
post
Post #2





Grupa: Zarejestrowani
Postów: 1 660
Pomógł: 13
Dołączył: 9.06.2004
Skąd: Wrocław i okolice

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
artur81
post
Post #3





Grupa: Zarejestrowani
Postów: 252
Pomógł: 2
Dołączył: 4.12.2004
Skąd: Skierniewice

Ostrzeżenie: (10%)
X----


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.

Ten post edytował artur81 12.05.2006, 07:06:16
Go to the top of the page
+Quote Post
TomASS
post
Post #4





Grupa: Zarejestrowani
Postów: 1 660
Pomógł: 13
Dołączył: 9.06.2004
Skąd: Wrocław i okolice

Ostrzeżenie: (0%)
-----


Ale swoją drogą, że behawior tak spowolaniał - dziwne.
Może spróbuj tak jak tutaj jest napisane.
Go to the top of the page
+Quote Post
artur81
post
Post #5





Grupa: Zarejestrowani
Postów: 252
Pomógł: 2
Dołączył: 4.12.2004
Skąd: Skierniewice

Ostrzeżenie: (10%)
X----


dalej jest tak samo, po prostu nie działa dobrze z tym behaviorem.
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




No to skoro juz uzgodniliście, ze to nie wina zapytania, to przenoszę (IMG:http://forum.php.pl/style_emoticons/default/smile.gif) A teraz se dyskutujcie o tym behaviorze czy jak to tam sie zwie (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
FiDO
post
Post #7





Grupa: Przyjaciele php.pl
Postów: 1 717
Pomógł: 0
Dołączył: 12.06.2002
Skąd: Wolsztyn..... Studia: Zielona Góra

Ostrzeżenie: (0%)
-----


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ę.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 24.08.2025 - 13:30