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

Pomoć oko indeksiranja i particionisanja

[es] :: MySQL :: Pomoć oko indeksiranja i particionisanja

[ Pregleda: 1522 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

maroon984

Član broj: 284654
Poruke: 57
*.teol.net.



+1 Profil

icon Pomoć oko indeksiranja i particionisanja29.05.2013. u 12:30 - pre 91 meseci
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
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15279
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2324 Profil

icon Re: Pomoć oko indeksiranja i particionisanja29.05.2013. u 12:53 - pre 91 meseci
ako uvek imas AND Korisnik=NekiID onda je najbolje po korisniku da napravis particije, 200 komada recimo, i ne mislis
 
Odgovor na temu

maroon984

Član broj: 284654
Poruke: 57
*.teol.net.



+1 Profil

icon Re: Pomoć oko indeksiranja i particionisanja29.05.2013. u 13:22 - pre 91 meseci
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)?
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15279
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2324 Profil

icon Re: Pomoć oko indeksiranja i particionisanja29.05.2013. u 13:31 - pre 91 meseci
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 ..
 
Odgovor na temu

maroon984

Član broj: 284654
Poruke: 57
*.teol.net.



+1 Profil

icon Re: Pomoć oko indeksiranja i particionisanja29.05.2013. u 13:45 - pre 91 meseci
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;


 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15279
*.oracle.co.uk.

Sajt: mysql.rs


+2324 Profil

icon Re: Pomoć oko indeksiranja i particionisanja30.05.2013. u 09:28 - pre 91 meseci
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
 
Odgovor na temu

Shinhan
PHP programmer
Subotica

Član broj: 12327
Poruke: 372
82.208.196.*

Jabber: shinhan@elitesecurity.org
ICQ: 400847988


+4 Profil

icon Re: Pomoć oko indeksiranja i particionisanja31.05.2013. u 09:09 - pre 91 meseci
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.
"Common sense is not so common." - Voltaire
 
Odgovor na temu

maroon984

Član broj: 284654
Poruke: 57
*.teol.net.



+1 Profil

icon Re: Pomoć oko indeksiranja i particionisanja14.06.2013. u 12:27 - pre 90 meseci
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);
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15279
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2324 Profil

icon Re: Pomoć oko indeksiranja i particionisanja14.06.2013. u 12:33 - pre 90 meseci
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)
 
Odgovor na temu

[es] :: MySQL :: Pomoć oko indeksiranja i particionisanja

[ Pregleda: 1522 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

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