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 |
|
15. 10. 2009. | #1 |
Goran Pilipović
Sir Write-a-Lot
|
Šta je brže?
Znam da ima ljudi koji vole da benchmark-uju MySQL, ja imam jedan praktičan problem i treba da donesem odluku. Ako imamo jednu tabelu users u kojoj imam klasicna polja:
user_id username ... country I u njoj ima 2 miliona records, od kojih treba da izvucem na primer sve kojima je country='RS' (KEY). Recimo da ima 120.000 records Tražimo klasično: SELECT ... WHERE country='RS' ... Međutim na 2M records ovo WHERE mi bode oči jer treba da bude što je moguće brže. Pade mi na pamet da je možda brže ako izbegnem WHERE pa da pored ove imam tabelu sa jednim poljem: create table users_rs ( user_id INT ... primary key (user_id) ); U kojoj su samo tih 120.000 koji si iz RS, i onda radimo ovako: SELECT ... FROM users_rs LEFT JOIN users USING (user_id) Pošto u tom select-u nema WHERE i ima manje recorda, da li neko misli da je to brže ili je samo wishfull thinking?
__________________
Goran Pilipović a.k.a. Ugly Fingers Bradley f.k.a. bluesman I don't always know what I'm talking about but I know I'm right! |
15. 10. 2009. | #2 |
član
Certified
Datum učlanjenja: 27.11.2007
Poruke: 71
Hvala: 10
12 "Hvala" u 11 poruka
|
Da li polazna baza sa 2M unosa već postoji ili se sada donosi odluka o tome kako će kompletan sistem da izgleda? Rekao bih da je u pitanju dizajn od nule.
U svakom slučaju odmah na početku bih savetovao protiv toga da se koriste odvojena tabela za bukvalno isti tip podataka jer se kosi sa nekim osnovnim pravilima dobrog dizajna baza a i stvoriće sigurno problema kasnije da ne pominjem da ne vidim nekog preteranog dobitka u performansama ako treba dodati i logiku odabira koja tabela će se koristiti. Ono što veoma liči na ovo odvajanje podataka a u stvari ima mnogo više smisla primeniti u ovom slučaju jeste particionisanje baze. Korisni linkovi: http://dev.mysql.com/doc/refman/5.1/...titioning.html http://dev.mysql.com/tech-resources/...titioning.html Poenta cele priče je da kada se upisuju podaci u bazu MySQL automatski na osnovu PARTITION BY direktiva upisuje podatke u zasebne particije pa se tako recimo kod SELECT upita automatski već na početku zna koja od particija se pretražuje. Dakle ako se definiše particionisanje po kodu zemlje i od ukupnog broja od 2M zapisa u bazi samo 120 000 zadovoljava uslov u bilo kakvom klasičnom upitu pretraživaće se isključivo particija koja zadovoljva uslov naveden pri particionisanju. Nema potrebe da objašnjavam kolika je razlika u performansama MySQL ne podržava još uvek sve oblike particionisanja ali verzija 5.1 nudi sasvim pristojan set opcija dovoljan za većinu potreba. |
15. 10. 2009. | #3 |
Super Moderator
Invented the damn thing
Datum učlanjenja: 06.06.2005
Poruke: 2.371
Hvala: 370
701 "Hvala" u 194 poruka
|
Jel se bese kaze "premature optimization is root of all evil" ili taj lik nije radio dating sajtove ?
Elem nisam skapirao da li u prvoj varijanti imas join ali ako ne onda je ona svakako brza od druge u kojoj ga imas. |
15. 10. 2009. | #4 |
old school
Professional
|
Ako ti MySQL podrzava particionisanje, onda razmisli o toj opciji, a ako ne, onda vjerujem da bi pri toj kolicini podataka index na koloni country pomogao samo u slucaju kada selektujes zemlju sa malim brojem korisnika.
U suprotnom ti ne preostaje nista drugo, nego full table scan, ali gledaj da kolonu country stavis odmah pri pocetku, a ne pri kraju...
__________________
Blog: Baze podataka ------------------------ Oracle OCP DBA Oracle OCE SQL Expert Oracle OCP Developer Certified MySQL DBA |
15. 10. 2009. | #5 |
profesionalac
Qualified
Datum učlanjenja: 19.05.2007
Poruke: 123
Hvala: 13
3 "Hvala" u 3 poruka
|
|
16. 10. 2009. | #6 | |
old school
Professional
|
Citat:
Ontopic: Index na koloni country ce pomoci, ako je selectivity za zeljenu zemlju manji od 15-20%, a u suprotnom ce biti ignorisan i izvrsice se full table scan...
__________________
Blog: Baze podataka ------------------------ Oracle OCP DBA Oracle OCE SQL Expert Oracle OCP Developer Certified MySQL DBA |
|
2 članova zahvaljuje Dejan Topalovic za poruku: |
15. 10. 2009. | #7 |
nobody
Expert
Datum učlanjenja: 19.04.2007
Poruke: 537
Hvala: 14
705 "Hvala" u 106 poruka
|
A je l' kolona country indeksirana? Ako nije, možda ne bi bilo na odmet probati. Mislim, zemalja nema ne znam koliko, pa bi u tom slučaju index trebalo da dosta pomogne.
|
15. 10. 2009. | #8 |
član
Certified
|
Nisam nikad koristio ovo particionisanje pa cu samo reci da ne razdvajas tabele u users_(country).
Imao sam slican primer na jednom sajtu gde otprilike postoji ~1,5M redova i podelio sam to na ~30ak tabela (sites_com, sites_uk, ...) i isprva to je bilo super resenje ali kada su poceli da mi trebaju upiti sa rezultatima iz svih ~30 tu su nastali problemi (de da radim upit sa 30 tabela istovremeno na sajtu koji je prilicno aktivan) tako da se u potpunosti slazem sa holodoc da ne pravis vise tabela za isti tip podataka Indeksiraj za pocetak po country u users tabeli i keshiraj sta god mozes |
15. 10. 2009. | #9 |
Goran Pilipović
Sir Write-a-Lot
|
Mislim da nisam dobro objasnio.
Moja users tabela ostaje ista i tamo če ostati svih 2M records (iako objektivno očekujem i više od 5M). A ova nova tabela će biti obična lookup tabela koja treba da skoni WHERE iz uslova pretrage. Znači služi samo za pretrage, na primer i situaciji kada treba da pronadjem sve iz RS, tražim iz te DODATNE tabele koja ima samo 1 polje, a originalnu users tabelu JOIN-ujem. Upisi u originalnoj tabeli stoje zauvek, nista se ne brise odande jedino sto za neke najčešće uslove pretrage ne tražim direktno iz nje sa WHERE nego iz ove druge pa JOIN-ujem.
__________________
Goran Pilipović a.k.a. Ugly Fingers Bradley f.k.a. bluesman I don't always know what I'm talking about but I know I'm right! |
15. 10. 2009. | #10 |
Milan Cvejic
Wrote a book
|
Predlog...
napravi tabelu users koja ima integer polje country_id. napravi tabely country u kojoj cesh da imash zemlje... posle SELECT * from users, country where users.country_id = country.id and country.country_name = 'RS'
__________________
http://weevify.com |
|
|