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:
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
}
?>