Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

ORDER BY optimizacija zavisi od LIMIT

[es] :: MySQL :: ORDER BY optimizacija zavisi od LIMIT

[ Pregleda: 4679 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

jedinstvenusername
PHP developer

Član broj: 282210
Poruke: 2
*.static.kdsinter.net.



Profil

icon ORDER BY optimizacija zavisi od LIMIT24.03.2011. u 10:56 - pre 159 meseci
Pozdrav.

Postoji ovaj upit:

Code:
SELECT *
FROM `zonex_content` AS `c`
WHERE c.module = 20
AND c.categoryID
IN ('50', '31', '16', '10')
ORDER BY `c`.`released` DESC
LIMIT 5


Tabela ima oko 500 000 redova ali ovaj upit nece vratiti nijedan.

Ako uradim EXPLAIN za LIMIT 3 dobijam ovo:

Code:
+----+-------------+-------+-------+-------------------+----------+---------+------+------+-------------+
| id | select_type | table | type  | possible_keys     | key      | key_len | ref  | rows | Extra       |
+----+-------------+-------+-------+-------------------+----------+---------+------+------+-------------+
|  1 | SIMPLE      | c     | index | module,categoryID | released | 5       | NULL | 1075 | Using where |
+----+-------------+-------+-------+-------------------+----------+---------+------+------+-------------+


Ako uradim EXPLAIN za limit 4 dobijam ovo:

Code:
+----+-------------+-------+------+-------------------+--------+---------+-------+------+-----------------------------+
| id | select_type | table | type | possible_keys     | key    | key_len | ref   | rows | Extra                       |
+----+-------------+-------+------+-------------------+--------+---------+-------+------+-----------------------------+
|  1 | SIMPLE      | c     | ref  | module,categoryID | module | 1       | const | 1364 | Using where; Using filesort |
+----+-------------+-------+------+-------------------+--------+---------+-------+------+-----------------------------+



Kao sto mozete videti za LIMIT 4 (i vece od 4) je ukljucen filesort tj. ne radi se ORDER BY optimizacija.

Da li neko zna kako ORDER BY optimizacija zavisi od LIMIT i kako (i da li) tu zavisnost mogu da izmenim?

Hvala unapred.
 
Odgovor na temu

VladaSu

Član broj: 31634
Poruke: 1099
*.dynamic.isp.telekom.rs.



+218 Profil

icon Re: ORDER BY optimizacija zavisi od LIMIT24.03.2011. u 13:54 - pre 159 meseci
Kako to da dobijes drugaciji rows?
To moze samo ako je drugi sql ili ako se nesto u medjuvremenu desilo sa tabelom.
[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: ORDER BY optimizacija zavisi od LIMIT24.03.2011. u 14:08 - pre 159 meseci
execution plan zavisi od order by i od limit negde od 5.1.28 (ili tako neke verzije ne secam se tacno, ali tako neka verzija u pola 5.1)

"kako" zavisi je prilicno kompleksna prica i zavisi od toga sta pise u statistici tabele

ne mozes da promenis default exec plan.

jedino sto mozes je da sa index hinting-om forsiras koristenje indexa koji ti mislis da je bolji

npr:
Code:

SELECT *
FROM `zonex_content` AS `c` FORCE INDEX (`released`)
WHERE c.module = 20
AND c.categoryID
IN ('50', '31', '16', '10')
ORDER BY `c`.`released` DESC
LIMIT 4


 
Odgovor na temu

jedinstvenusername
PHP developer

Član broj: 282210
Poruke: 2
*.static.kdsinter.net.



Profil

icon Re: ORDER BY optimizacija zavisi od LIMIT24.03.2011. u 14:52 - pre 159 meseci
Ljudi, hvala na odgovorima.

Citat:
VladaSu: Kako to da dobijes drugaciji rows?
To moze samo ako je drugi sql ili ako se nesto u medjuvremenu desilo sa tabelom.


Sad sam pogledao, povecanjem LIMIT-a povecava se i rows sve dok se ne ukljuci filesort. SQL je isti samo se LIMIT povecava. Takodje, tabela ostaje nepromenjena.

Ono sto sam zaboravio napomenuti a ispostavilo sa da je vrlo bitno je to sto su i `module`, `categoryID` i `released` zasebni indeksi. Ako dodam multi indeks na `module` i `categoryID` onda rows ostaje konstantan.



Citat:
bogdan.kecman: execution plan zavisi od order by i od limit negde od 5.1.28 (ili tako neke verzije ne secam se tacno, ali tako neka verzija u pola 5.1)

"kako" zavisi je prilicno kompleksna prica i zavisi od toga sta pise u statistici tabele

ne mozes da promenis default exec plan.



Ovde sam objasnio situaciju sa prve masine. Na drugoj masini na kojoj se nalazi slicna tabela sa istim indeksima se isto to desava ali je razlika u tome sto se tamo filesort ne ukljucuje na 4 vec negde na 60. Zbog toga sam mislio da to mozda zavisi od nekih podesavanju bafera u my.cnf. Onda sam usporedio conf fajlove i primenio isti na obe masine ali stanje je ostalo nepromenjeno. E sad, posto sam zakljucio da nije do podesavanja, ono sto mi je palo na pamet ja nacin na koji mysql bira rows kojima ce pristupiti pri ORDER BY optimizaciji. E o tome ne znam nista reko' da pitam da li neko zna. Modules ima samo tri vrednosti a categoryID 39 u content tabeli te mozda i to utice na ovaj LIMIT 'prag'.



 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: ORDER BY optimizacija zavisi od LIMIT24.03.2011. u 15:39 - pre 159 meseci
optimizer odlucuje koji ce exec plan da koristi u odnosu na podataka iz statusa tabele (show table status). tu su kardinalnost indexa, broj slogova, prosecna velicina sloga etc ... sve to uzima u obzir i odlucuje (vrlo zeznutom i ne uvek tacnom) matematikom koji plan je naj-optimalniji. Zasto na jednom serveru ta promena ide na 5 a na drugom na 60 je zato sto se razlicite podaci nalaze u tabelama, razlicite podatke optimizer vidi za status te tabele te donosi drugaciju odluku.

kao sto rekoh, ako ti izmeris da ti je "uvek" brze da koristi jedan index a ne drugi, a ti forsiraj taj index kao sto sam ti pokazao.

jedan od primera na primer je ako select treba da vrati vise od 30% slogova iz jedne tabele onda je jeftinije da se radi table scan nego da se tabeli pristupa preko indexa, tako da ako optimizer skonta da je to slucaj on ce da se odluci za table scan .. i 90% slucajeva ce biti u pravu, za onih 10% slucajeva postoji index hinting
 
Odgovor na temu

VladaSu

Član broj: 31634
Poruke: 1099
*.dynamic.isp.telekom.rs.



+218 Profil

icon Re: ORDER BY optimizacija zavisi od LIMIT24.03.2011. u 22:27 - pre 159 meseci
@bogdan.kecman
Zanimljivo, thx.
[Ovu poruku je menjao VladaSu dana 14.06.2003. u 11:22 GMT+1]
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.31.24.217.adsl2.beograd.com.

Sajt: mysql.rs


+2377 Profil

icon Re: ORDER BY optimizacija zavisi od LIMIT24.03.2011. u 22:52 - pre 159 meseci
svaki sql server radi na taj nacin. uvek ide nesto tipa

- parsiras sql
- izracunas koji ti je exec plan najoptimalniji
- izvrsis taj plan
- vratis rezultate

e sad, "parsiras sql" deo je najbolji na svetu, to je ono gde je mysql bezobrazno brzi i bolji od bilo kog konkurenta... u poredjenju sa pgsql-om to je brze par stotina puta !!! zato su "prosti upiti" na mysql-u toliko brzi
ono sto je problem je taj "izracunas koji ti je exec plan najoptimalniji" deo na mysql-u nije najjaci deo mysql-a. tu je pgsql mnooooogo bolji na primer... i zato pgsql mnogo cesce komplikovane upite izvrsava mnogo brze .. zato sto njihov optimizer (to se kod njih zove drugacije al nije bitno) nalazi najoptimalniji exec plan u 99.9% slucajeva .. to je vrlo zeznut deo svakog database servera .. (ok izvrsavanje je takodje vrlo bitno kao i svasta jos) .. i zavisi od mnogo toga, statistike su jedna od bitnijih stvari ...

inace statistike u nekom slucaju mogu da budu "pokarambasene" - i da bi osvezili statistike odradite "ANALYZE TABLE"

 
Odgovor na temu

Shinhan
PHP programmer
Subotica

Član broj: 12327
Poruke: 372
*.static.isp.telekom.rs.

Jabber: shinhan@elitesecurity.org
ICQ: 400847988


+4 Profil

icon Re: ORDER BY optimizacija zavisi od LIMIT25.03.2011. u 08:19 - pre 159 meseci
Najbolji index za dati query jeste (module, categoryId)

Ako napraviš taj index ne zaboravi da obrišeš (module) index jer (module,categoryId) index može da se koristi umesto samo (module) indexa.
"Common sense is not so common." - Voltaire
 
Odgovor na temu

[es] :: MySQL :: ORDER BY optimizacija zavisi od LIMIT

[ Pregleda: 4679 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.