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

Vise where nad velikom tabelom

[es] :: MySQL :: Vise where nad velikom tabelom

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

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

svepomalo

Član broj: 306404
Poruke: 167



+21 Profil

icon Vise where nad velikom tabelom20.03.2019. u 23:48 - pre 2 meseca
Pozdrav svima,

ovako, ovo je dizajn forme i tabele:


Tabela sa proizvodima ima oko 1.3M redova.
Website je dropdwon, imace 7 - 8 sajta (URL, amazon.com, amazon.co.uk....)
First Found i Last Scrapped su datumi, klik na njih otvara range, dakle datum "od" i "do" i tako za oba datuma
Da li sacuvati kao integer (unixtimestamp) ili date field type?
Price, je takodje range, kada se klikne ispod se pokazu 2 input field-a, "od" i "do", moguce vrednosti su decimal od 0.1 do 100k
Wishlist (integer od 1 do 100k), Review Score (decimal od 1, 1.1, 1.2 do 4.8, 4.9, 5)
Filter za ove 3 kolone idu po range-u, isto kao za Price
Category izbor kategorije (iscupam jedinstvene vrednosti iz tabele)

Gubim se oko ovih filtera, kako ovo uraditi najbolje, ne mogu na sve kolone da stavim index, a ako koristim multiple columns?
Ako uradim ovako:
Code:
ALTER TABLE `pages` ADD INDEX `numberOne`    (`website`, `date_found`, `date_scrapped`, `price`, `wishlist`);

buni me, jer u formi moze da selektuje website ali ne i date scrapped na primer, na filter moze da sadrzi jednu kolonu, sve kolone ili samo neke tri na primer.
Opet imam range, pa bi neki query izgleda ovako ako je user izabrao website, napravio range za price i izabrao samo review score "from" field:
Code:
SELECT * FROM `products` WHERE `website` = 'amazon.co.uk' AND `price` > 10 AND `price` < 20 AND `review_score` > 4.5

Kako bi ste resili ovo a da radi brzo?
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15079
*.dynamic.sbb.rs.

Sajt: mysql.rs


+2295 Profil

icon Re: Vise where nad velikom tabelom21.03.2019. u 00:34 - pre 2 meseca
dizajn forme je nebitan, a dizajn tabele se sa te slike ne vidi

mozes da imas nekoliko razlicitih kompozitnih indexa, posebno sto tabela nije velika i sto nemas tu neki ogroman insert flow

cena i score nema svrhe da ti budu indexirani
 
Odgovor na temu

svepomalo

Član broj: 306404
Poruke: 167



+21 Profil

icon Re: Vise where nad velikom tabelom21.03.2019. u 00:53 - pre 2 meseca
Da znam da je nebitan dizajn, cisto sam hteo da pokazem sta sve ulazi u filter.
Kada kazes da mogu da imam vise razlicitih kompozitnih indexa, koliko da ih napravim?
Ispravi me ako gresim, mislim da je bitno kada koristim where da je bitan i redosled?
Tipa, nije isto ako je index, po websites, category, date_scrapped onda where bi trebalo da bude where website = 'site' and category 'usb'?
Mislim kako onda radi ako user nije izabrao category?
Bas ovo mi je problem, sta ako user ne odabere neki filter a taj filter je index koji je prvi po redu u kompozitnom indeksu?
Ili npr. sta ako koristi samo range za price a kazes da nema smisla da bude indeksiran, zar onda nece da prodje kroz celu tabelu?
I jbm mu sunce, kako ih vise napravim, koliko kombinacija ima?
Mozda lupam :/
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

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

Sajt: mysql.rs


+2295 Profil

icon Re: Vise where nad velikom tabelom21.03.2019. u 01:17 - pre 2 meseca
redosled u where je nebitan, redosled u kompozitnom indexu je bitan...
pricao sam i pisao do sada mnogo puta za kompozitne, dakle ako imas


where a=1 and b=2 and c=3 and d > 10

moguci indexi koji se koriste za to su

(a,b,c,d)

(a,c,b,d)

(b,c,a,d)

(b,a,c,d)

(c,a,b,d)

(c,b,a,d)

(valjda nisam neki propustio :D )

ako imas inded (a,b,c,d) ono gde on moze da se koristi je

a=1 and b=2 and c=3 and d> 4

a>1

a=1

a=1 and b=2

a=1 and b>2

a=1 and b=2 and c>3

a=1 and b=2 and c=3


ako imas samo npr

b=2

tu taj index ne moze da se koristi


ako imas

where a>1 and b>1

tu ce se koristiti ili neki index koji pocinje sa a ili index koji
pocinje sa b tako sto ce optimizer odluciti gde mu je bolja kardinalnost
/ gde ce vise odseci tim indexom a za drugi uslov onda kroz taj rezultat
radi klasican scan (bez indexa)

koliko indexa, koliko oces :D zavisi kakvi su ti upiti :D ... dodatni
index ti usporava insert sto tebi nije problem jer imas patetican broj
inserta u minuti, dodatni index ti zauzima ram sto danas ne bi trebalo
da ti je rpoblem kada su serveri sa 128G rama dostupni za sica pare a
cela baza ti je ispod 2 miliona slogova sto je sitno..

ono sto je dobro je sto mozes da pravis index statistiku pa da izbacis
indexe koje ne koristis
 
Odgovor na temu

svepomalo

Član broj: 306404
Poruke: 167



+21 Profil

icon Re: Vise where nad velikom tabelom21.03.2019. u 01:29 - pre 2 meseca
Hvala Bogdane :)

Jasnije je sada :)


Dakle kombinacije ne ginu, a sta mi je sada palo na pamet, mozda je teska glupost :)
Sta mislis, da imam jedan kompozitni indeks? a, b, c, d, e
e sad, ako user nije izabrao nista za a, ja to ishendlam u app-u, i kazem where a >= najmanja vrednost za a kolonu, tipa jednom dnevno opicim kron i sacuvam najmanju vrednost za svaku kolonu?
ove textove smestim na kraju u indexu?

Jel ovo ima smisla ili ne?

Najvise me buni, jer ne znam kakvi ce tacno upiti da budu, bukvalno where moze da ima bilo koju kolonu, jednu ili vise, i kako da to sve pokriem sa indexima :(
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

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

Sajt: mysql.rs


+2295 Profil

icon Re: Vise where nad velikom tabelom21.03.2019. u 01:56 - pre 2 meseca
nema smisla, znaci ako imas index (a,b,c,d) i user trazi samo
filtriranje po a to ce da koristi taj index najnormalnije nema ti sta da
dodajes tu .. a ako imas index (a,b,c,d) i ti u where kazes a>1 dalje za
b,c i d se ne koristi index vec samo za a ... dakle kompozitni index
vazi za == od pocetka i prestaje da se koristi zavrsno sa prvim range >
ili < ... dakle ti ako kazes a>1 svi ostali uslovi za taj upit ne
koriste index
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

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

Sajt: mysql.rs


+2295 Profil

icon Re: Vise where nad velikom tabelom21.03.2019. u 02:00 - pre 2 meseca
inace za pretrage tog tipa, user obicno hoce da kucne tekst sta ga
zanima i da vidi poredjenje na sajtovima, bole ga uvo dal je ovaj ili
onaj sajt i slicno ... eventualno oce pored teksta da kucne cenu od do i
to je to .. tako da je bolje tu dodas jedan full text index ... ili
koristis neki externi elastic search ili sphinx ili ... za search nego ...

posto vidi, ti ovde imas upit gore "product name", i to ti je neki
match, taj index ce ti se koristiti 99% vremena i svi ovi ostali filteri
se "nece koristiti uopste" bez obzira koliko ih napravis, on ce ti
odraditi FTS kroz product name (nadam se da ti je to FTS a ne like %$xx%
) i sve ostale filtere ce radi klasican scan kroz result set

tako da napravis po jedan single index za svaku kolonu i fts index na name
i to je to
 
Odgovor na temu

svepomalo

Član broj: 306404
Poruke: 167



+21 Profil

icon Re: Vise where nad velikom tabelom21.03.2019. u 03:10 - pre 2 meseca
da jasno :)

turio sam FTS nad title colonom
metnuo i review score index single
like odavno ne korisitm mada i FTS nisam neko vreme, pozaboravljao sam stvari:D
dakle ovako
Code:

ALTER TABLE `trending` ADD FULLTEXT(`title`);
ALTER TABLE `trending` ADD INDEX(`review_score`);

SELECT * FROM `trending` WHERE MATCH(title) AGAINST('knife') and review_score > 4.5 limit 50

tabela ima 1350585 redova, i ovaj upit traje 0.0158 seconds

explain kaze:
Code:

+------+-------------+----------+----------+--------------------+-------+---------+------+------+-------------+
| id   | select_type | table    | type     | possible_keys      | key   | key_len | ref  | rows | Extra       |
+------+-------------+----------+----------+--------------------+-------+---------+------+------+-------------+
|    1 | SIMPLE      | trending | fulltext | review_score,title | title | 0       |      |    1 | Using where |
+------+-------------+----------+----------+--------------------+-------+---------+------+------+-------------+
1 row in set (0.00 sec)


mislim da je ok?

e sada, kada mu ovo opalim:
Code:

SELECT * FROM `trending` WHERE MATCH(title) AGAINST('kn') and review_score > 4.5 limit 50


dakle umesto 'knife' stavim 'kn' onda izbaci empty set, to je bese zato sto se kn nalazi u vise od 50% redova?
ali kad probam sa IN BOOLEAN MODE, isto empy, zar ne bi trebalo da vrati neki result?

ako user nije nista nije uneo u title za product, ne bi trebalo da stavljam MATCH u query? nema smisla, jel tako? :)

ovo je moj localhost komp, win10, 10.1.38-MariaDB, xampp, sve default
probacu i na serveru, iscimam admina da digne server pa da vidim tamo, mozda bude bolje (performance)
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

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

Sajt: mysql.rs


+2295 Profil

icon Re: Vise where nad velikom tabelom21.03.2019. u 03:47 - pre 2 meseca
ne nego zato sto ti je min za FTS po defaultu 3 slova (mozes da smanjis
ali nema svrhe)

da, ako je sadrzaj prazan treba da nemas taj match

baci to go..no od marije, stavi ili percona mysql ili original oraclov mysql
 
Odgovor na temu

djoka_l
Beograd

Član broj: 56075
Poruke: 2586



+1079 Profil

icon Re: Vise where nad velikom tabelom21.03.2019. u 07:21 - pre 2 meseca
Ovde ti ne treba ni jedan indeks osim full text search.

Sve ostalo ima malu kardinalnost u odnosu na veličinu tabele.
Ne znam kakvi su ti podaci, možda ima smisla indeks nad datumstkim poljima, ali nije sve u kardinalnosti, pitanje je koliko često se ona koriste u uslovima pretrage.
 
Odgovor na temu

svepomalo

Član broj: 306404
Poruke: 167



+21 Profil

icon Re: Vise where nad velikom tabelom21.03.2019. u 11:59 - pre 2 meseca
hvala puno, odradio sam tabelu, za sada svaka kolona je index, i fts nad title
podigao percona mysql na serveru
da sredim jos front-end pa cu da im da koriste
javljam kako bude :)
 
Odgovor na temu

[es] :: MySQL :: Vise where nad velikom tabelom

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

Postavi temu Odgovori

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