[ Funkman @ 30.11.2007. 09:29 ] @
Bok

Tu sastavljam već mjesecima nešto i staalno gubim vrijeme zbog optimizacije. U biti, brijem da je optimizirano do jaja al eto, volio bih čuti ako je netko radio s većim bazama, kako optimizacija šljaka i kako uopće šljaka optmiziran kod.

Google sam iscrpio kolko mi se dalo i kolko je trebalo, pa ako radi tko s tim, eto, zanima me jel ovo OK rješenje ili ima boljih. Nisam fakat stručnjak za MySQL, i ono, ako pretpostavim da će mi se određeni queriji koristit baš doslovce tisuće puta u satu ili čak i više, zanima me kolko je ovo ok rješenje.

Imamo query:

SELECT tablica1. *
FROM tablica1, tablica2
WHERE tablica2.neki_id = tablica1.id
AND tablica2.neki_id ='1'
UNION
SELECT tablica1. *
FROM tablica1, tablica2
WHERE tablica2.neki_id = tablica1.id
AND tablica2.neki_id ='2'
UNION
SELECT tablica1. *
FROM tablica1, tablica2
WHERE tablica2.neki_id = tablica1.id
AND tablica2.neki_id ='3'
UNION
SELECT tablica1. *
FROM tablica1, tablica2
WHERE tablica2.neki_id = tablica1.id
AND tablica2.neki_id ='4'
UNION
SELECT tablica1. *
FROM tablica1, tablica2
WHERE tablica2.neki_id = tablica1.id
AND tablica2.neki_id ='5'
UNION
SELECT tablica1. *
FROM tablica1, tablica2
WHERE tablica2.neki_id = tablica1.id
AND tablica2.neki_id ='6'


Što mi daje 6 redova iz tablice 1 cijelih (MyISAM engine, oko 15 polja u redu)

I PHPom to čupam:

$r = mysql_query($sql) or die(mysql_error());
$this->max = mysql_num_rows ($r);
$i = 1;
while ($i <= $this->max)
{

$this->tablica1[$i] = mysql_fetch_assoc($r);
$i++;
}

}

}



Pa ispišem:

$test = new Klasa;

$test->funkcija_u_klasi();
$a = 1;
while ($a <= $test->max) {
echo $test->tablica1[$a][neko_polje] . "<br />"; //associative array dobijem krasan
$a++;
}


E sad. UNION kažu je brži od OR ili XOR koji mogu koristit i napisat kraći query.
Indexe sam postavio na polje 'id' u svakoj tablici.

Ako netko radi s sličnim (makar i na PostgreSQL ili možda oracle ) i imao je priliku raditi s aplikacijama koje drmaju sličan query na bazu, s recimo više tisuća SELECT-ova po satu, dajte mišljenje jel ovo OK ili može bolje.

Point mi i je dobiti MAKSIMALNOOOO brze querije i vrlo optimizirane, tako da su na velikoj količini upisa i ispisa gubici vremenski štooo manji.

Npr, kaže mi mysql (na hrvackom) ako stavim to u njegov SQL window:

"Prikazivanje redaka 0 - 5 (6 ukupno, Upit je trajao 4f sek)"

Pa 4f je valjda super

Ako je ovo OK, recite. Ako ima bolje rješenje, vrlo rado ću saslušat jer praktički prvi put se backam s tom optimizacijom i između spika "mysql best handles simple queries" i "indexes are good" ne snalazim se baš. :) Bed.

Zahvaljujem unaprijed.
[ chachka @ 30.11.2007. 17:53 ] @
Stavi 'UNION ALL' umesto 'UNION'.