|
SQL baze podataka - Sponzor: Baze-Podataka.net MySQL, MSSQL, Oracle, Access, ODBC. Ako imate problem brže i preciznije ćete dobiti odgovor ako priložite strukturu tabela ili skript koji kreira tabele i puni ih test podacima umesto što to problem opisujete samo rečima. Sponzor: Baze-Podataka.net - Blog o bazama podataka |
|
Alati teme | Način prikaza |
13. 08. 2009. | #1 |
profesionalac
Qualified
Datum učlanjenja: 19.05.2007
Poruke: 123
Hvala: 13
3 "Hvala" u 3 poruka
|
[MySQL] Optimizacija upita, indexi
Pozdrav.
http://rapidshare.com/files/26687315...v.sql.zip.html Sa linka iznad mozete skinuti SQL fajl sa bazom i 3 tabele (njihova struktura i testni podaci). Dakle, 3 tabele u kojima se čuvaju informacje o vijestima, kategorijama i autorima. Princip news sistema. Napisao sam upit koji ispisuje 5 vijesti iz odredjene kategorija koja ima svoje potkategorije. Vijesti su soritrane po pozijama i vremenu objave ukoliko ne bude dovoljno vijesti kojima su označene pozicije, jer upit treba da vrati uvijek 5 redova. Upit je ispod. Kôd:
SELECT v.id, v.naslov, a.ime_prezime, v.mala_slika, v.uvod FROM vijesti v, kategorije k, administratori a WHERE k.kategorija_id = v.kategorija AND v.autor = a.id AND v.tip =1 AND v.media =0 AND v.pozicija IN ( '5', '6', '7', '8', '9', '1000' ) AND k.parent_id IN ( 4, 5 ) AND v.id NOT IN ( 22083, 22075, 22077, 22070 ) AND v.datum_objave <= '2009-08-13 10:58:00' ORDER BY v.pozicija, v.datum_objave DESC LIMIT 5 Na bazu od 20.000 reedova upit se izvrsava u prosjeku nekih 0.3s sto mi je puno jer ovakih upita imam oko 10-tak na naslovnici (razlciite pozicije (v.pozicija) i kategorija (k.parent_id)). EXPLAIN upita vraca: http://www.imagesforme.com/show.php/636527_explain.jpg Ja sam stavio odredjne indexe (vidjećete kada ako pogledate sturkturu tabela iz priloga) koje MySQL i korsiti, tako da je kolona Rows u EXPLAIN tabele sasvim OK. Problem je očigledno kod onog što je napisano u EXTRA koloni. Mislim da bi se ovaj upit trebao brze zvrsavati, no za to mi je potrebna vasa pomoć? Imate li prijedloga kako da podesim indexe? Nadam se da nisam nista propustio spomenuti. Hvala unaprijed. Poslednja izmena od mb_sa : 13. 08. 2009. u 13:23. Razlog: tipfeleri |
13. 08. 2009. | #2 |
old school
Professional
Datum učlanjenja: 15.06.2005
Lokacija: Novi Beograd
Poruke: 448
Hvala: 21
70 "Hvala" u 46 poruka
|
Kandidati za indeks su: (tim redom):
- vesti.kategorija - vesti.datum_objave - vesti.pozicija pa dodaj jedan po jedan, testiraj i vidi da li se nešto menja.
__________________
http://www.vesic.org | Blog: http://www.vesic.org/blog/ | Fina kolekcija programa: http://www.vesic.org/programi/ |
13. 08. 2009. | #3 |
profesionalac
Qualified
Datum učlanjenja: 19.05.2007
Poruke: 123
Hvala: 13
3 "Hvala" u 3 poruka
|
@DejanVesic
EXPLAIN vraca iste rezultate. Vrijeme izvrsavanja takodjer isto. Ne znam da li si zapazio ali kolona 'pozicija' je pobrojani tip (ENUM) i negdje sam pročitao da za njih nije potrebno stavljati indexe, a takodjer ona sadrzai vrijenodsti od 1-16, te 1000, od cega je 99,99 posto vrijednost 1000, nije li i to premala kardinalost? Ispravi me ako grijesim? Hvala. ------ I dalje imam prolbem, ali primjetio sam da su bolja vremena izvrsavanja bez ijednog indexa. U tom slucaju nema kreiranja temp tabele (Using temporary). lijep pozdrav. |
13. 08. 2009. | #4 |
old school
Professional
Datum učlanjenja: 15.06.2005
Lokacija: Novi Beograd
Poruke: 448
Hvala: 21
70 "Hvala" u 46 poruka
|
Nisam MySQL ekspert, ali recimo na Oracle / SQL sistemima se indeksi vrlo često ne koriste ako je kardinalnost tabela ispod nekog limita - prosto je jednostavnije učitati celu tabelu u memoriju no juriti po b-stablima od indeksa. Zato i stoji da za jako male skupove indeks i ne treba.
Što se tiče enuma - moguće je da se pravi implicitni indeks (ali ovo debelo treba proveriti dokumentaciju). U suštini, ako je rezultujući set pre primene tog uslova dovoljno mali, onda će se filtriranje po poziciji raditi prostim upoređivanjem (indeks ne treba). Ako je veliki, onda definitivno treba da postoji neki način da nađe slogove koji zadovoljavaju uslov. Za veliku količinu podataka neki od indeksa će definitivno pomoći.
__________________
http://www.vesic.org | Blog: http://www.vesic.org/blog/ | Fina kolekcija programa: http://www.vesic.org/programi/ |
14. 08. 2009. | #5 |
profesionalac
Qualified
Datum učlanjenja: 19.05.2007
Poruke: 123
Hvala: 13
3 "Hvala" u 3 poruka
|
Hvala na odgovoru.
U MySQL dokumentaciji pise da neće korstiti index za order by ako se mixaju ASC i DESC, mada sam ja stavljao ORDER BY v.pozicija DESC, v.datum_objave DESC, ali opet ista situacija. Nisam pametan |
14. 08. 2009. | #6 |
VD IT Direktora
Invented the damn thing
Datum učlanjenja: 08.06.2005
Lokacija: Beograd
Poruke: 2.118
Hvala: 503
1.307 "Hvala" u 282 poruka
|
Nemam mysql da probam, ali me živo zanima da li se menja execution plan ako se upit napiše pomoću JOIN-ova:
Kôd:
SELECT v.id, v.naslov, a.ime_prezime, v.mala_slika, v.uvod FROM vijesti v left join kategorije k on k.kategorija_id = v.kategorija left join administratori a v.autor = a.id WHERE v.tip =1 AND v.media =0 AND v.pozicija IN ( '5', '6', '7', '8', '9', '1000' ) AND k.parent_id IN ( 4, 5 ) AND v.id NOT IN ( 22083, 22075, 22077, 22070 ) AND v.datum_objave <= '2009-08-13 10:58:00' ORDER BY v.pozicija, v.datum_objave DESC LIMIT 5 |
14. 08. 2009. | #7 | |
profesionalac
Qualified
Datum učlanjenja: 19.05.2007
Poruke: 123
Hvala: 13
3 "Hvala" u 3 poruka
|
Citat:
I mysql ih sam cache-ira, ali sto znate nakon update nad tabelom, cache je uništen. Planirao sam da neke cache-iram preko PAER cache-lite (lifetime bi mogao da bude 5 minuta), ali ne mogu ih sve. |
|
14. 08. 2009. | #8 |
član
Certified
Datum učlanjenja: 24.02.2009
Poruke: 55
Hvala: 0
11 "Hvala" u 7 poruka
|
Probaj da stavis index na kategorije u redosledu (parent_id, kategorija_id)
|
14. 08. 2009. | #9 |
profesionalac
Qualified
Datum učlanjenja: 19.05.2007
Poruke: 123
Hvala: 13
3 "Hvala" u 3 poruka
|
|
15. 08. 2009. | #10 |
I'm a PC too.
Wrote a book
Datum učlanjenja: 06.06.2005
Lokacija: Kanada
Poruke: 1.354
Hvala: 82
130 "Hvala" u 89 poruka
|
A kolika je ta tvoja baza? Možda je suviše mala trenutno da bi bilo neke razlike?
__________________
Commercial-Free !!! |
|
|
Slične teme | ||||
Tema | Početna poruka teme | Forum | Odgovori | Poslednja poruka |
kako rezultate mysql upita najlakse smjestiti u tabelu..? | dejan86 | PHP | 8 | 16. 09. 2009. 01:15 |
MySQL optimizacija | bluesman | SQL baze podataka - Sponzor: Baze-Podataka.net | 2 | 27. 02. 2009. 16:47 |
MySQL - Optimizacija querija | dinke | SQL baze podataka - Sponzor: Baze-Podataka.net | 12 | 18. 06. 2007. 23:39 |
MySQL import - više upita iz fajla ili stringa | Ilija Studen | PHP | 6 | 09. 07. 2006. 17:07 |
potrebna pomoc oko SQL upita | ivanhoe | SQL baze podataka - Sponzor: Baze-Podataka.net | 4 | 10. 02. 2006. 18:09 |