[ maroon984 @ 29.05.2013. 12:30 ] @
Pozdrav svima.

Imam tabelu na MySQL 5.5:
Code:

CREATE TABLE `korisnici_log` (
`ID_korisnici_log` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`Korisnik` SMALLINT(5) UNSIGNED NOT NULL,
`VrijemePristupa` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`Tip` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
`Aktivan` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
`Status` TINYINT(3) UNSIGNED NULL DEFAULT NULL,
PRIMARY KEY (`ID_korisnici_log`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;


Na koji nacin da kreiram indekse i da je particionisem, ako su upiti tipa:

Code:
SELECT bla, bla FROM korisnici_log WHERE VrijemePristupa BETWEEN '2013-05-01' AND '2013-05-07' AND Korisnik=NekiID;


cesto bude i

Code:
...AND Aktivan=1 AND Status=NekiStatus;


???

U tabelu dnevno ide oko 1 000 000 upisa, a korisnika ima oko 4000.
Kontao sam da particionisem kolonu VrijemePristupa sa PARTITION BY RANGE po mjesecima, jer cesto "cistim" tabelu po mjesec dana pa mi odgovara taj DROP PARTITION ili TRUNCATE PARTITION.

Hvala
[ bogdan.kecman @ 29.05.2013. 12:53 ] @
ako uvek imas AND Korisnik=NekiID onda je najbolje po korisniku da napravis particije, 200 komada recimo, i ne mislis
[ maroon984 @ 29.05.2013. 13:22 ] @
Tesko da ce ici particije po korisniku, jer se oni cesto mijenjaju i u upitu moze da bude WHERE korisnici IN (korisnik1, korisnik2, ...) koji mogu da budu iz vise particija....
Da li da pravim dva indexa Korisnik i VrijemePristupa ili jedan multiple?
Da li je u multiple indexu vazan raspored kolona, tj. da li je index(Korisnik, VrijemePristupa) == index(VrijemePristupa, Korisnik)?
[ bogdan.kecman @ 29.05.2013. 13:31 ] @
i sa in radi posao, ali napisi tacno kakvi su ti upiti, ne mozes da pitas kako da uradim za upit X a onda da kazes ali necu da koristim X nago Y ..
[ maroon984 @ 29.05.2013. 13:45 ] @
Upiti su tipa:

Code:
SELECT bla, bla FROM korisnici_log WHERE 
VrijemePristupa BETWEEN '2013-05-01' AND '2013-05-07' AND 
Korisnik=NekiID;


Code:
SELECT bla, bla FROM korisnici_log WHERE 
VrijemePristupa BETWEEN '2013-05-01' AND '2013-05-07' AND 
Korisnik IN (NekiID, NekiDrugiID, ...., NekiNtiID);


Code:
SELECT bla, bla FROM korisnici_log WHERE 
VrijemePristupa BETWEEN '2013-05-01' AND '2013-05-07' AND 
Korisnik IN (NekiID, NekiDrugiID, ...., NekiNtiID) AND 
Aktivan=1 AND 
Status=NekiStatus;


[ bogdan.kecman @ 30.05.2013. 09:28 ] @
sa tim takvim upitima, da, najbolje po vremenu onda da particionises

Citat:
maroon984:
Da li je u multiple indexu vazan raspored kolona, tj. da li je index(Korisnik, VrijemePristupa) == index(VrijemePristupa, Korisnik)?


da. kompozitni indexi se koriste "po redu" dakle ako imas kompozitni index (a,b,c) upit where b=10 nece moci da koristi taj index, moci ce da ga koristi

where a=10
where a=10 and b=20
where a=10 and b=20 and c=30

ali samo where b=20 and c=30 ne moze da koristi taj index
[ Shinhan @ 31.05.2013. 09:09 ] @
Takođe, ako radiš range query (kao što radiš BETWEEN za datume), onda se ignoriše desni deo indexa.

Npr, ako radiš pretragu po ID korisnika i Vrijeme BETWEEN xx AND yy index (VrijemePristupa, Korisnik) će se koristiti samo za datum (a ne i za indexiranje po korisniku), pa je mnogo bolje imati (Korisnik, VrijemePristupa) koji će se ceo iskoristiti.
[ maroon984 @ 14.06.2013. 12:27 ] @
Da li je onda bolje imati dva indexa (VrijemePristupa) i (Korisnik), nego kompozitni (VrijemePristupa, Korisnik), ako je upit:

Code:
SELECT bla, bla FROM korisnici_log WHERE 
VrijemePristupa BETWEEN '2013-05-01' AND '2013-05-07' AND 
Korisnik IN (NekiID, NekiDrugiID, ...., NekiNtiID);
[ bogdan.kecman @ 14.06.2013. 12:33 ] @
vremepristupa, korisnik sigurno ne valja za takav upit, korisnik, vremepristupa teoretski moze da valja ali da, tu je najbolje 2 indexa nezavisna pa ce mysql proceniti kardinalnost i odluciti koji index da koristi. za takav upit na zalost uvek ce koristiti samo jedan (doduse u 5.6 postoje neke znacajne promene koje dovode do toga da moze i drugacije ali nisam skroz u toku sa tim izmenama pa ne bih pricao napamet)