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

koliko indexa po upitu koristi MySQL?

[es] :: MySQL :: koliko indexa po upitu koristi MySQL?

[ Pregleda: 2075 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

bjevta
Bratislav Jevtic
http://www.tojesoft.co.rs
Beograd

Član broj: 5216
Poruke: 367
*.static.sbb.rs.

Sajt: www.tojesoft.co.rs


+5 Profil

icon koliko indexa po upitu koristi MySQL?20.10.2011. u 09:24 - pre 152 meseci
Varijante:
1. Ako je upit nad jednom tabelom

2. Ako je upit nad vise tabela

U topic-u http://www.elitesecurity.org/t...QL-dizajn-za-bolje-performanse sam nasao "mysql moze (za sada) u jednom upitu da koristi samo 3 indexa..." (bogdan)

Cini mi se da sam negde procitao da moze 1 index po tabeli. rekao bih po EXPLAIN-u da je i dalje tako.

Aj sad, ako neko zna, kakva je situacija u v5.5?
Acta, non verba!
 
Odgovor na temu

VladaSu

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



+218 Profil

icon Re: koliko indexa po upitu koristi MySQL?20.10.2011. u 11:12 - pre 152 meseci
Ne znam kojom logikom bi koristio 2 indexa po tabeli.
Koliko sam shvatio index sluzi za to kojim redosledom da iscitava iz baze, tj. brze da dodje do podatka i da ga iscita.
Ako je upit nad vise tabela onda moze da koristi onoliko indexa koliko ima tabela.

A kako iskombinovati 2 indexa prilikom iscitavanja jedne table to ne znam kako bi mogao i kako bi ga to ubrzalo jer bi onda morao 2 puta da iscitava.

Nisam proucavao kako radi vec sam ovo zakljucio na osnovu rada i explain i ono sto sam procitao o indexima.


[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: koliko indexa po upitu koristi MySQL?20.10.2011. u 13:24 - pre 152 meseci
@vladasu, ne tako ne rade indexi.

e sada, postoje upiti i postoje upiti ... komplexan subselect moze da koristi vise od 3 indexa zato sto je to realno vise od jednog upita, dakle ova prica se odnosi na jedan "prost upit", subselect je druga prica

ima logika kojom ima smisla da koristis i 10 indexa po tabeli ... ali je mysql ne zna (ni u verziji 5.5).

max 3 indexa po upitu i dalje

ne postoji ogranicenje 1 index po tabeli od verzije 5.0 kada je uveden index merge

pravljenje kompozitnih indexa je i dalje najbolji nacin za projektovanje baze posto postoji mnogo uslova koji mora da budu ispujneni da bi index merge odradio posao kako treba.
 
Odgovor na temu

VladaSu

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



+218 Profil

icon Re: koliko indexa po upitu koristi MySQL?20.10.2011. u 16:35 - pre 152 meseci
Bogdane, mozes li da postavis neki primer kako da isforsiram da koristim vise index-a na jednoj tabeli a da to nije union? Dobro bi mi doslo.
Ili to mysql sam skonta sta je najbolje.
Imam dosta veliku kolicinu podataka i veliki broj sql-ova nad tabelom i vidim da mysql koristi proizvoljno indexe a nekada mislim da bi mi bas dobro doslo da iskoristi jos jedan index a u explain vidim da ne koristi.
[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
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2377 Profil

icon Re: koliko indexa po upitu koristi MySQL?20.10.2011. u 16:46 - pre 152 meseci
select * from t1 where f1=10 and f2=20;

ako postoji index na f1 i index na f2 koristice oba (index merge), mada je zaq ovaj upit bolje ako postoji index (f1,f2)
 
Odgovor na temu

VladaSu

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



+218 Profil

icon Re: koliko indexa po upitu koristi MySQL?20.10.2011. u 16:54 - pre 152 meseci
Ja imam brdo razlicitih sql-ova na tabeli i desetak indexa i nikada explain mi ne kaze da koristi vise od jednog index.
Imam i bas ovakav primer koji si ti dao ali opet samo jedan index explain kaze...

Code (sql):

SELECT * FROM t1 WHERE f1=10 AND f2=20;
 


U bazi f1 i f2 mogu da imaju vrednost od 0 do 20.
Bilo bi logicno da koristi oba indexa ali uvek kaze samo jedan. Logujem explain.
[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: koliko indexa po upitu koristi MySQL?20.10.2011. u 20:26 - pre 152 meseci
Code:

mysql> show create table t1\G
*************************** 1. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `i` int(11) DEFAULT NULL,
  `j` int(11) DEFAULT NULL,
  `k` int(11) DEFAULT NULL,
  KEY `i_i` (`i`),
  KEY `i_j` (`j`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> explain select * from t1 where i=123 or j=456;
+----+-------------+-------+-------------+---------------+---------+---------+------+------+-----------------------------------+
| id | select_type | table | type        | possible_keys | key     | key_len | ref  | rows | Extra                             |
+----+-------------+-------+-------------+---------------+---------+---------+------+------+-----------------------------------+
|  1 | SIMPLE      | t1    | index_merge | i_i,i_j       | i_i,i_j | 5,5     | NULL |    8 | Using union(i_i,i_j); Using where |
+----+-------------+-------+-------------+---------------+---------+---------+------+------+-----------------------------------+
1 row in set (0.04 sec)


pitanje je samo da li mu se isplati da koristi union ili ne ... sa OR je mnogo veca sansa da se isplati, sa AND je mnogo manja posto ako sa jednim indexom izvadi dovoljno mali rezultat onda mu se ne isplati da pravi presek
 
Odgovor na temu

bjevta
Bratislav Jevtic
http://www.tojesoft.co.rs
Beograd

Član broj: 5216
Poruke: 367
*.dynamic.sbb.rs.

Sajt: www.tojesoft.co.rs


+5 Profil

icon Re: koliko indexa po upitu koristi MySQL?20.10.2011. u 21:47 - pre 152 meseci
poprilično sati sam proveo optimizujući problematične upite na real-life bazama klijenata (jedna te ista aplikacija, samo drugi klijenti) i nikad, baš nikad, nisam video "index_merge" u explain-u. od merdžovanja indexa digao ruke, prešao na kompozitne indexe i, kao, "pođe me karta".

-----------------
jedan problem su mi upiti u kojima se vrte velike tabele (1 000 000+) slogova i gde se dinamički pravi SQL (where klauzula) pa ne znam unapred koje će kolone da se nađu u where klauzuli. na primer, uvek mi trebaju kolone C3, C4 ali se u where klauzuli nađe neka mutljavina:

SELECT DISTINCT C3, C4 WHERE C1='A' AND C2 IN ('X', 'Y', 'Z') AND C3 IN (1, 2, 16, 55) AND C5=12 AND C8 IN (8,18,32)

dakle, jedno 5 kolona u WHERE klauzuli od kojih 1 i u SELECT-u.

to trenutno rešavam kompozitnim indeksima i rekao bih da je prihvatljivo, mada mislim da može bolje.
-----------------
drugi problem su upiti koji se rasplinu po pola grafa pa imam 15 tabela u kojima se nešto JOIN-uje, WHERE-uje, itd. tu mi ni kompozitni indeksi nisu bili dovoljno dobri pa sam ih "ojačao" sa EXISTS/subSELECT umesto JOIN/WHERE, gde god sam mogao. imam utisak da je tako brže - više manjih upita umesto jednog kapitalca.
explain mi kaže da se uvek koristi neki index.
-----------------

ako neko ima neki tip u vezi ove 2 strategije, mikrofon je Vaš.


sad malo da kukam:
cena koju sam platio jeste da sam morao da migriram ID-jeve iz parent tabela u grand-child tabele (T0, T1, T2, pa se ID od T0 nađe u T2 da bih mogao da napravim kompozitni index).

nosim se mišlju da predložim redizajniram modela, što nije jednostavno (vreme za razvoj, migracija, QA, itd.), ili da pokupim i šta mi ne treba iz baze po sistemu "drpi i beži" pa da "krajcujem" u Java-i.


Acta, non verba!
 
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: koliko indexa po upitu koristi MySQL?21.10.2011. u 00:08 - pre 152 meseci
Citat:
nikad, baš nikad, nisam video

ne znaci mnogo .. nisi video nikad ni ndb-api aplikaciju pa ti nista ne fali zbog toga :) ... uvek je bolje napraviti kompozitni index nego racunati na index merge

Citat:
dinamički pravi SQL

zavisi kako se isti generise vrlo cesto mysql kod takvih "losih" upita ne ume da se snadje dovoljno dobro (ako ga poredimo sa konkurencijom)

Citat:
to trenutno rešavam kompozitnim indeksima i rekao bih da je prihvatljivo, mada mislim da može bolje.

"bolje" je vrlo subjektivno, uvek moze bolje, pitanje je da li se isplati. kompozitni indexi su ok resenje, obrati samo paznju na limite koje oni imaju. na zalost mi jos uvek nemamo neki brojac u serveru koji bi rekao koliko puta je neki index koristen u nekoj tabeli ... ja sam pravio neki budz patch za neki projekat ispostavilo se da 65% indexa u bazi koji su postojali *nikad* ne budu pipnuti .. (ok to je bilo vrlo lose dizajnirano svejedno) ... postoji sansa da ce se takav brojac jednom naci u generalnom sorsu servera .. znacice mnogima :D

Citat:
upiti koji se rasplinu po pola grafa pa imam 15 tabela u kojima se nešto JOIN-uje

to je smrt za mysql. mnogo bolje mnogo malih upita, dal u sp-u ili u skriptu ili sa subselectima (mada to ume da bude lose resenje cesto) ali ti ogromni upiti su za mysql smrt, tu je konkurencija znacajno brza

Citat:
redizajniram modela

univerzalni model ne postoji, neke mane se uvek vide kasno ma koliko iskustva se ima pri dizajniranju, posle nekog vremena rada na aplikaciji uvek se vide mogucnosti za popravku ... obrati samo paznju da uvek treba da krenes od normalizovanog modela pa da njega denormalizujes "sa namerom", a ne da prestanes na putu ka normalizaciji zato sto "predvidjas da je tako bolje"... redizajn uvek ima prednosti (implementacija stecenog iskustva) i mane (vreme/novac) tako da uvek ima vaga ... bitno je da postoji dokumentacija i da su definisani standardi onda se mane smanjuju na minimum
 
Odgovor na temu

bjevta
Bratislav Jevtic
http://www.tojesoft.co.rs
Beograd

Član broj: 5216
Poruke: 367
*.dynamic.sbb.rs.

Sajt: www.tojesoft.co.rs


+5 Profil

icon Re: koliko indexa po upitu koristi MySQL?21.10.2011. u 06:15 - pre 152 meseci
Citat:
ispostavilo se da 65% indexa u bazi koji su postojali *nikad* ne budu pipnuti


e, da, to sam cak i ja primetio. u 5.1 zna da bude potrebno prilično truda da se postave indeksi koji će zaista i biti upotrebljeni. imam utisak da je 5.1 rado koristio foreign key index kod join-a i pored toga što postoji kompozitni index koji je očigledno bolji izbor (zahvata kolone iz where klauzule).

recimo, prosti join nad 2 tabele:

SELECT <lista kolona> FROM T_PARENT JOIN T_CHILD ON T_PARENT.PARENT_ID = T_CHILD.PARENT_ID WHERE T_CHILD.STATUS = 'READY'

može da koristi samo foreign key nad T_CHILD.PARENT_ID umesto očigledno pogodnijeg T_CHILD.PARENT_ID+T_CHILD.STATUS. jedino ako obrišem foreign key index a ostavim samo kompozitni, onda mogu da računam da će izabrati "pravi". moram ovo da ispitam u 5.5.

koja je, uopšte, logika iza izbora indeksa? kakav je uticaj WHERE klauzule na izbor indexa, posebno kod JOIN-ovanja, kao u prethodnom primeru?


Acta, non verba!
 
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: koliko indexa po upitu koristi MySQL?21.10.2011. u 12:45 - pre 152 meseci
na exec path uvek moze da utices tako sto kazes mysql-u koje indexe da koristi. To ti je uvek najsigurniji put (naravno ako znas sta radis).
http://dev.mysql.com/doc/refman/5.1/en/index-hints.html
http://dev.mysql.com/doc/refman/5.5/en/index-hints.html

kako optimizer odabira najbolji exec path je uber komplikovana procedura i nije bas nesto extra jaka strana mysql-a. Svodi se na to da se za svaki exec path izracunava "cost" u odnosu na podatke o statistici te tabele te se onda uzima onaj path koji kosta najmanje. Ako znas unapred sta je za tvoju tabelu "najbrze" ti odradi sa index hinting force key ili ako je neki sigurno spor - ignore key ...
 
Odgovor na temu

[es] :: MySQL :: koliko indexa po upitu koristi MySQL?

[ Pregleda: 2075 | Odgovora: 10 ] > FB > Twit

Postavi temu Odgovori

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