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:
Baza danych komputery uruchomiony na localhost # phpMyAdmin SQL Dump # version 2.5.3 # # Host: localhost # Czas wygenerowania: 12 Maj 2006, 07:23 # Wersja serwera: 4.0.15 # Wersja php: 4.3.3 # # Baza danych : `komputery` # # -------------------------------------------------------- # # Struktura tabeli dla `czesci_zestawu` # CREATE TABLE `czesci_zestawu` ( `id_czesci` int(4) NOT NULL AUTO_INCREMENT, `id_kategorii` tinyint(2) DEFAULT NULL, `id_uzytkownika` int(3) DEFAULT NULL, `id_zestawu` int(4) DEFAULT NULL, `id_dostawcy` tinyint(2) DEFAULT NULL, `nazwa` char(50) DEFAULT NULL, `cena` float(5,2) DEFAULT NULL, `nr_f_vat` char(15) DEFAULT NULL, `nr_licencji` char(50) DEFAULT NULL, `data_wygasniecia` date DEFAULT NULL, `data_dostarczenia` date DEFAULT NULL, `id_statusu` tinyint(1) DEFAULT NULL, `id_rejestru_fk` char(8) DEFAULT NULL, `uwagi` char(255) DEFAULT NULL, PRIMARY KEY (`id_czesci`) ) TYPE=MyISAM AUTO_INCREMENT=235 ; # -------------------------------------------------------- # # Struktura tabeli dla `dostawcy` # CREATE TABLE `dostawcy` ( `id_dostawcy` tinyint(2) NOT NULL AUTO_INCREMENT, `nazwa` varchar(40) DEFAULT NULL, `ulica` varchar(40) DEFAULT NULL, `miasto` varchar(25) DEFAULT NULL, `telefon` varchar(20) DEFAULT NULL, `fax` varchar(20) DEFAULT NULL, `email` varchar(30) DEFAULT NULL, PRIMARY KEY (`id_dostawcy`) ) TYPE=MyISAM AUTO_INCREMENT=2 ; # -------------------------------------------------------- # # Struktura tabeli dla `historia` # CREATE TABLE `historia` ( `id_historia` int(11) NOT NULL AUTO_INCREMENT, `id_zestawu` int(11) DEFAULT NULL, `nazwa_czesci` char(50) NOT NULL DEFAULT '', `akcja` char(15) NOT NULL DEFAULT '', `data_zmiany` date NOT NULL DEFAULT '0000-00-00', `poprzedni_stan` char(50) NOT NULL DEFAULT '', `obecny_stan` char(50) NOT NULL DEFAULT '', PRIMARY KEY (`id_historia`) ) TYPE=MyISAM AUTO_INCREMENT=235 ; # -------------------------------------------------------- # # Struktura tabeli dla `kategorie` # CREATE TABLE `kategorie` ( `id_kategorii` tinyint(2) NOT NULL AUTO_INCREMENT, `nazwa` char(40) NOT NULL DEFAULT '', PRIMARY KEY (`id_kategorii`) ) TYPE=MyISAM AUTO_INCREMENT=26 ; # -------------------------------------------------------- # # Struktura tabeli dla `lic` # CREATE TABLE `lic` ( `id` tinyint(1) NOT NULL AUTO_INCREMENT, `f` char(255) NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) TYPE=MyISAM AUTO_INCREMENT=2 ; # -------------------------------------------------------- # # Struktura tabeli dla `statusy` # CREATE TABLE `statusy` ( `id_statusu` tinyint(1) NOT NULL AUTO_INCREMENT, `nazwa` char(30) DEFAULT NULL, PRIMARY KEY (`id_statusu`) ) TYPE=MyISAM AUTO_INCREMENT=6 ; # -------------------------------------------------------- # # Struktura tabeli dla `uzytkownicy` # CREATE TABLE `uzytkownicy` ( `id_uzytkownika` int(3) NOT NULL AUTO_INCREMENT, `imie` char(30) DEFAULT NULL, `nazwisko` char(50) DEFAULT NULL, `stanowisko` char(50) DEFAULT NULL, `nr_pokoju` char(4) DEFAULT NULL, `telefon` char(20) DEFAULT NULL, `email` char(30) DEFAULT NULL, PRIMARY KEY (`id_uzytkownika`) ) TYPE=MyISAM AUTO_INCREMENT=16 ; # -------------------------------------------------------- # # Struktura tabeli dla `zestawy` # CREATE TABLE `zestawy` ( `id_zestawu` int(3) NOT NULL AUTO_INCREMENT, `id_dostawcy` tinyint(2) DEFAULT NULL, `data_dostarczenia` date DEFAULT NULL, `cena` float(5,2) DEFAULT NULL, `nr_f_vat` char(15) DEFAULT NULL, `nr_licencji` char(50) DEFAULT NULL, `data_wygasniecia` date DEFAULT NULL, `id_statusu` tinyint(1) DEFAULT NULL, `id_rejestru_fk` char(8) DEFAULT NULL, `uwagi` char(255) DEFAULT NULL, `nazwa` char(50) DEFAULT NULL, `id_uzytkownika` int(3) DEFAULT NULL, PRIMARY KEY (`id_zestawu`) ) TYPE=MyISAM AUTO_INCREMENT=17 ;
Zapytanie:
SELECT czesci_zestawu.id_czesci, kategorie.nazwa, uzytkownicy.nazwisko, uzytkownicy.imie, uzytkownicy.stanowisko, uzytkownicy.nr_pokoju, zestawy.nazwa, dostawcy.nazwa, czesci_zestawu.nazwa, czesci_zestawu.cena, czesci_zestawu.nr_f_vat, czesci_zestawu.nr_licencji, czesci_zestawu.data_wygasniecia, czesci_zestawu.data_dostarczenia, statusy.nazwa, czesci_zestawu.id_rejestru_fk, czesci_zestawu.uwagi FROM czesci_zestawu, kategorie, uzytkownicy, statusy, zestawy, dostawcy 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:
<?php //nagłówek tabeli $id_czesci= $rekord[0]; $kategoria=$rekord[1]; $nazwisko=$rekord[2]; $imie=$rekord[3]; $stanowisko=$rekord[4]; $nr_pokoju=$rekord[5]; $zestaw = $rekord[6]; $dostawca=$rekord[7]; $nazwa=$rekord[8]; $cena=$rekord[9]; $nr_f_vat=$rekord[10]; $nr_licencji=$rekord[11]; $data_wygasniecia=$rekord[12]; $data_dostarczenia=$rekord[13]; $status=$rekord[14]; $id_rejestru_fk=$rekord[15]; $uwagi=$rekord[16]; echo '<tr class="podswietl"> <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> <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> <td align="center" class="komorka">'.$nazwa.'</td> <td align="center" class="komorka">'.$kategoria.'</td> <td align="center" class="komorka">'.$zestaw.'</td> <td align="center" class="komorka">'.$dostawca.'</td> <td align="center" class="komorka" title="'.$stanowisko.' w pokoju nr '.$nr_pokoju.'">'.$nazwisko.' '.$imie.'</td> <td align="center" class="komorka">'.$status.'</td> <td align="center" class="komorka">'.$cena.'</td> <td align="center" class="komorka">'.$nr_f_vat.'</td> <td align="center" class="komorka">'.$nr_licencji.'</td> <td align="center" class="komorka">'.$data_wygasniecia.'</td> <td align="center" class="komorka">'.$data_dostarczenia.'</td> <td align="center" class="komorka">'.$id_rejestru_fk.'</td> <td align="center" class="komorka">'.$uwagi.'</td> </tr>'; // dalsza cześć skryptu } ?>