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
FiDO
post
Post #2





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

Posty w temacie


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: 3.10.2025 - 13:16