MySQL vypis z tabulky podla kategorii v inych tabulkach
MySQL vypis z tabulky podla kategorii v inych tabulkach
Dobry. Mal by som taky problem, potrebujem z databazy vypisat slovne vsetky udaje, aj ked ich tam mam cislami. Najlepsie by som to vedel uviest na priklade:
Mam tabulku, kde mam vsetky znacky aut
tab_kategoria_znacka
znackaID, znacka
1, 'audi'
2, 'skoda'
3, 'fiat'
Mam tabulku, kde mam vsetky typy motorov
tab_kategoria_typmotoru
typmotoruID, typmotoru
1, 'benzinovy'
2, 'dieslovy'
Mam tabulku so vsetkymi konkretnymi autami
tab_auta
autoID, znacka, typmotoru, nazov, popis
Konkretne auto v databaze vyzera nasledovne:
3, 3, 1, 'ferove auto', 'popis toho auta'
Chcem aby som dal dotaz na vsetky auta kde znacka='3' a typmotoru='1', a chcem, aby vypis vyzeral nasledovne:
3, 'fiat', 'benzinovy', 'ferove auto', 'popis toho auta' - toto chcem
Viem pouzit dotaz: SELECT * FROM tab_auta WHERE znacka='3' AND typmotoru='1'
Lenze tento dotaz samozrejme vypise: 3, 3, 1, 'ferove auto', 'popis toho auta'
Tymto by som chcel poprosit, kto by mi vedel pomoct. Zaroven sa chcem opytat, ci je to vhodny sposob ukladania udajov? Lebo si myslim, ze vkladat kazdemu autu slovom vsetky udaje je pamatovo narocne.
Este som rozmyslal, ze by som tie kategorie ukladal do pola v PHP, a potom si ich len cislami pytal z tych poli. Lenze mat vsetky udaje v databaze, mi pride vhodnejsie. Dakujem.
Mam tabulku, kde mam vsetky znacky aut
tab_kategoria_znacka
znackaID, znacka
1, 'audi'
2, 'skoda'
3, 'fiat'
Mam tabulku, kde mam vsetky typy motorov
tab_kategoria_typmotoru
typmotoruID, typmotoru
1, 'benzinovy'
2, 'dieslovy'
Mam tabulku so vsetkymi konkretnymi autami
tab_auta
autoID, znacka, typmotoru, nazov, popis
Konkretne auto v databaze vyzera nasledovne:
3, 3, 1, 'ferove auto', 'popis toho auta'
Chcem aby som dal dotaz na vsetky auta kde znacka='3' a typmotoru='1', a chcem, aby vypis vyzeral nasledovne:
3, 'fiat', 'benzinovy', 'ferove auto', 'popis toho auta' - toto chcem
Viem pouzit dotaz: SELECT * FROM tab_auta WHERE znacka='3' AND typmotoru='1'
Lenze tento dotaz samozrejme vypise: 3, 3, 1, 'ferove auto', 'popis toho auta'
Tymto by som chcel poprosit, kto by mi vedel pomoct. Zaroven sa chcem opytat, ci je to vhodny sposob ukladania udajov? Lebo si myslim, ze vkladat kazdemu autu slovom vsetky udaje je pamatovo narocne.
Este som rozmyslal, ze by som tie kategorie ukladal do pola v PHP, a potom si ich len cislami pytal z tych poli. Lenze mat vsetky udaje v databaze, mi pride vhodnejsie. Dakujem.
Re: MySQL vypis z tabulky podla kategorii v inych tabulkach
SELECT
t1.nazov, t1.popis, t2.znacka, t3.typmotoru
FROM
tab_auta t1, tab_kategoria_znacka t2, tab_kategoria_typmotoru t3
WHERE
t1.znacka = t2.znackaID and
t1.typmotoru = t3.typmotoruid and
t2.znacka='3' AND t3.typmotoru='1'
ak som nepomiesal t1 t2 t3 tak by to malo byt ok
t1.nazov, t1.popis, t2.znacka, t3.typmotoru
FROM
tab_auta t1, tab_kategoria_znacka t2, tab_kategoria_typmotoru t3
WHERE
t1.znacka = t2.znackaID and
t1.typmotoru = t3.typmotoruid and
t2.znacka='3' AND t3.typmotoru='1'
ak som nepomiesal t1 t2 t3 tak by to malo byt ok
Re: MySQL vypis z tabulky podla kategorii v inych tabulkach
Vdaka za skoru odpoved dotazu som pochopil, vyzera, ze to funguje. Len posledny riadok bolo treba napisat este 2x id:
SELECT
t1.nazov, t1.popis, t2.znacka, t3.typmotoru
FROM
tab_auta t1, tab_kategoria_znacka t2, tab_kategoria_typmotoru t3
WHERE
t1.znacka = t2.znackaid and
t1.typmotoru = t3.typmotoruid and
t2.znackaid='3' AND t3.typmotoruid='1'
SELECT
t1.nazov, t1.popis, t2.znacka, t3.typmotoru
FROM
tab_auta t1, tab_kategoria_znacka t2, tab_kategoria_typmotoru t3
WHERE
t1.znacka = t2.znackaid and
t1.typmotoru = t3.typmotoruid and
t2.znackaid='3' AND t3.typmotoruid='1'
Re: MySQL vypis z tabulky podla kategorii v inych tabulkach
no jasne
ten som skopiroval od teba a nepozeral
este tam ostalo capsom napisane AND
K tomu sposobu ukadania dat, takto by to malo byt celkom OK. Sice sa nevenujem navrhu DB, ale s DB s ktorou pracujem je to podobne riesene a to su tam tisicky a tisicky zaznamov.
K tomu sposobu ukadania dat, takto by to malo byt celkom OK. Sice sa nevenujem navrhu DB, ale s DB s ktorou pracujem je to podobne riesene a to su tam tisicky a tisicky zaznamov.
Re: MySQL vypis z tabulky podla kategorii v inych tabulkach
Osobne mi príde trošku nepraktické ukladať jednu "vlastnosť" auta do samostatnej tabuľky, keďže tie majú (okrem ID) len jeden atribút a ten by pokojne mohol byť zaradený priamo v tabuľke tab_auta...Príklad:
Teraz máš v tab_auta cca takéto záznamy (autoID, znacka, typmotoru, nazov, popis):
3, 3, 1, 'ferove auto', 'popis toho auta'
Po úprave by si mal priamo takéto záznamy:
3, 'fiat', 'benzinovy', 'ferove auto', 'popis toho auta'
...a nemusel by si sa trápiť so spájaním tabuliek...
Teraz máš v tab_auta cca takéto záznamy (autoID, znacka, typmotoru, nazov, popis):
3, 3, 1, 'ferove auto', 'popis toho auta'
Po úprave by si mal priamo takéto záznamy:
3, 'fiat', 'benzinovy', 'ferove auto', 'popis toho auta'
...a nemusel by si sa trápiť so spájaním tabuliek...
-
audiotrack
VIP
- Príspevky: 25958
- Registrovaný: 09 sep 2005, 18:39
- Kontaktovať používateľa:
Re: MySQL vypis z tabulky podla kategorii v inych tabulkach
jeho návrh je správne spravený. Keby tieto hodnoty dáš priamo do tej tabuľky, narazíš časom na viacero problémov.konyk87 napísal:Osobne mi príde trošku nepraktické ukladať jednu "vlastnosť" auta do samostatnej tabuľky, keďže tie majú (okrem ID) len jeden atribút a ten by pokojne mohol byť zaradený priamo v tabuľke tab_auta...Príklad:
Teraz máš v tab_auta cca takéto záznamy (autoID, znacka, typmotoru, nazov, popis):
3, 3, 1, 'ferove auto', 'popis toho auta'
Po úprave by si mal priamo takéto záznamy:
3, 'fiat', 'benzinovy', 'ferove auto', 'popis toho auta'
...a nemusel by si sa trápiť so spájaním tabuliek...
Re: MySQL vypis z tabulky podla kategorii v inych tabulkach
Môžeš byť konkrétnejší, prosím?
-
audiotrack
VIP
- Príspevky: 25958
- Registrovaný: 09 sep 2005, 18:39
- Kontaktovať používateľa:
Re: MySQL vypis z tabulky podla kategorii v inych tabulkach
prvý problém: ukladáš si k autám značky. Napríklad reťazec "fiat". Povedzme že o rok sa automobilka fiat totálne zmení a pretransformuje, a začne výrabať nejaké úplne iné typy áut, no stále bude pod menom fiat. Budeme potrebovať rozlišťovať medzi jedným a druhým fiatom. Ty to nedokážeš, lebo všetko je fiat. On to dokáže, lebo niečo je fiat s id 10 a iné je fiat s id 11. Dva rovnaké názvy, no dve rôzne hodnoty. Toto tvoj návrhy nedokáže
druhý problém: presný opak prvého - dva rôzne názvy ale jedna hodnota. Ak bude mať v databáze "benzín" a "benzin" tak sú to dve hodnoty. AK vo vyhľadávaní niekto zadá benzin s krátkym "i" tak mu kopec záznamov (s dlhým "i") nenájde. Ak by to mal samostatne, môže si spraviť slovník a definovať dvom rôznym záznamom (benzin aj benzín) rovnaké ID. Tým vyriešil aj fulltextové vyhľadávanie s chybami, aj prípadnú jazykovú lokalizáciu
tretí problém: ty máš pri každom zázname reťazec. To je typu text (v lepšom prípade pre značku stačí tinytext). To je stále neporovnateľne dlhšie ako varchar(2) čo by mu pokrylo 99 rôznych značiek. Tieto značky (ako text) mu stačí vypísať iba raz do samostatnej tabuľky namiesto toho aby ich písal tisíce krát v tabuľke s autami. V konečnom dôsledku ušetrí kopec priestoru
viac sa mi písať nechce, je pol jednej a mám za sebou dlhu cestu tak idem spať. Zajtra (teda už dnes) v škole pozdrav na databázach drlíka a že mu odkazujem aby vám dal na zápočte opakovanie z normálových foriem lebo tie databázy nejak flákate
druhý problém: presný opak prvého - dva rôzne názvy ale jedna hodnota. Ak bude mať v databáze "benzín" a "benzin" tak sú to dve hodnoty. AK vo vyhľadávaní niekto zadá benzin s krátkym "i" tak mu kopec záznamov (s dlhým "i") nenájde. Ak by to mal samostatne, môže si spraviť slovník a definovať dvom rôznym záznamom (benzin aj benzín) rovnaké ID. Tým vyriešil aj fulltextové vyhľadávanie s chybami, aj prípadnú jazykovú lokalizáciu
tretí problém: ty máš pri každom zázname reťazec. To je typu text (v lepšom prípade pre značku stačí tinytext). To je stále neporovnateľne dlhšie ako varchar(2) čo by mu pokrylo 99 rôznych značiek. Tieto značky (ako text) mu stačí vypísať iba raz do samostatnej tabuľky namiesto toho aby ich písal tisíce krát v tabuľke s autami. V konečnom dôsledku ušetrí kopec priestoru
viac sa mi písať nechce, je pol jednej a mám za sebou dlhu cestu tak idem spať. Zajtra (teda už dnes) v škole pozdrav na databázach drlíka a že mu odkazujem aby vám dal na zápočte opakovanie z normálových foriem lebo tie databázy nejak flákate
Re: MySQL vypis z tabulky podla kategorii v inych tabulkach
Prvý problém - ako rozlíši v konečnom výpise fiat a fiat?
Druhý problém - benzin a benzín by som asi ošetril v aplikácií pri vkladaní do DB, ale zas nikdy nevieš, kedy sa nájde blb, ktorý to tam vloží ručne a zle
Tretí problém - ok, toto beriem
ale ďakujem za odpovede, pýtal som sa len tak pre záujímavosť
ps: prosím ťa, kto by chodil v piatok do školy?
Druhý problém - benzin a benzín by som asi ošetril v aplikácií pri vkladaní do DB, ale zas nikdy nevieš, kedy sa nájde blb, ktorý to tam vloží ručne a zle
Tretí problém - ok, toto beriem
ale ďakujem za odpovede, pýtal som sa len tak pre záujímavosť
ps: prosím ťa, kto by chodil v piatok do školy?
Re: MySQL vypis z tabulky podla kategorii v inych tabulkach
Trošku sa časom vraciam k MySQL a k tomuto dotazu:
Mám problém s rýchlosťou MySQL.
Mám napr. tabuľku všetkých obcí Európy(niekoľko tisíc záznamov) - OBCE - obec_id, obec_nazov.
Mám tabuľku príspevkov (niekoľko tisíc záznamov) - PRISPEVKY, kde každý príspevok má stĺpec prispevok_obec_id.
Rovnakým spôsobom ako je MySQL kód vyššie hľadám názvy podľa prispevok_obec_id v tabuľke OBCE.
A teda pri vyhľadávaní zobrazujem pri každom príspevku názov obce, získané podľa WHERE obec_id =prispevok_obec_id ( z druhej tabuľky).
Vyhľadávanie je veľmi pomalé (okolo 6 sekúnd na rýchlom počítači).
Ako sa tomu vyhnúť? Resp. mám ukladať radšej všetky informácie o príspevku priamo do jedenej hlavnej tabuľky PRISPEVKY na ktorej vyhľadávam?
Lebo potom to ide hneď (do 1 sekundy). Veľmi sa do MySQL nevyznám, myslel som, že môj spôsob je dobrý (normalizovaný), no ide to pomaly.
Dúfam, že som to napísal zrozumiteľne, ďakujem za reakcie a rady.
Kód: Vybrať všetko
SELECT
t1.nazov, t1.popis, t2.znacka, t3.typmotoru
FROM
tab_auta t1, tab_kategoria_znacka t2, tab_kategoria_typmotoru t3
WHERE
t1.znacka = t2.znackaID and
t1.typmotoru = t3.typmotoruid and
t2.znacka='3' AND t3.typmotoru='1'Mám napr. tabuľku všetkých obcí Európy(niekoľko tisíc záznamov) - OBCE - obec_id, obec_nazov.
Mám tabuľku príspevkov (niekoľko tisíc záznamov) - PRISPEVKY, kde každý príspevok má stĺpec prispevok_obec_id.
Rovnakým spôsobom ako je MySQL kód vyššie hľadám názvy podľa prispevok_obec_id v tabuľke OBCE.
A teda pri vyhľadávaní zobrazujem pri každom príspevku názov obce, získané podľa WHERE obec_id =prispevok_obec_id ( z druhej tabuľky).
Vyhľadávanie je veľmi pomalé (okolo 6 sekúnd na rýchlom počítači).
Ako sa tomu vyhnúť? Resp. mám ukladať radšej všetky informácie o príspevku priamo do jedenej hlavnej tabuľky PRISPEVKY na ktorej vyhľadávam?
Lebo potom to ide hneď (do 1 sekundy). Veľmi sa do MySQL nevyznám, myslel som, že môj spôsob je dobrý (normalizovaný), no ide to pomaly.
Dúfam, že som to napísal zrozumiteľne, ďakujem za reakcie a rady.
-
audiotrack
VIP
- Príspevky: 25958
- Registrovaný: 09 sep 2005, 18:39
- Kontaktovať používateľa:
Re: MySQL vypis z tabulky podla kategorii v inych tabulkach
a tie prispevok_obec_id a obec_id sú primárne kľúče?
Re: MySQL vypis z tabulky podla kategorii v inych tabulkach
Nie, príspevok má vlastné primárne ID prispevok_id (tabuľka PRISPEVKY). Ale obec_id je primárne (tabuľka OBCE).
(30000) tabuľka PRISPEVKY - prispevok_id, prispevok_obec_id, prispevok_datum, prispevok_nazov, prispevok_text
(10000) tabuľka OBCE - obec_id, obec_nazov
Lebo ak som dotaz správne pochopil, ja vlastne spájam dve tabuľky čo spraví 30000x10000, preto to zrejme toľko trvá.
//autoeditácia príspevku (15 Jún 2011, 23:49)
Ešte doplním, že som hľadal aj na Googly, cez veľa fór, a veľa ľudí má podobný problém. Zaujímavé je aj článok http://www.mysqlperformanceblog.com/200 ... ge-tables/ . Zrejme to tak bude, ze JOIN príliš spomaľuje. Radšej nebudem mať normalizovaný ten stĺpec no, keď sa to asi inak nedá.
(30000) tabuľka PRISPEVKY - prispevok_id, prispevok_obec_id, prispevok_datum, prispevok_nazov, prispevok_text
(10000) tabuľka OBCE - obec_id, obec_nazov
Lebo ak som dotaz správne pochopil, ja vlastne spájam dve tabuľky čo spraví 30000x10000, preto to zrejme toľko trvá.
//autoeditácia príspevku (15 Jún 2011, 23:49)
Ešte doplním, že som hľadal aj na Googly, cez veľa fór, a veľa ľudí má podobný problém. Zaujímavé je aj článok http://www.mysqlperformanceblog.com/200 ... ge-tables/ . Zrejme to tak bude, ze JOIN príliš spomaľuje. Radšej nebudem mať normalizovaný ten stĺpec no, keď sa to asi inak nedá.
Re: MySQL vypis z tabulky podla kategorii v inych tabulkach
napis uplnu strukturu tabuliek a query ake nad nimi robis, napriklad jedna z optimalizacii moze byt spravit 3 tabulky obce, prispevky a spajaciu tabulku obce prispevkyEverhard napísal:Nie, príspevok má vlastné primárne ID prispevok_id (tabuľka PRISPEVKY). Ale obec_id je primárne (tabuľka OBCE).
(30000) tabuľka PRISPEVKY - prispevok_id, prispevok_obec_id, prispevok_datum, prispevok_nazov, prispevok_text
(10000) tabuľka OBCE - obec_id, obec_nazov
Kód: Vybrať všetko
tabuľka PRISPEVKY - prispevok_obec_id(primarny), prispevok_datum, prispevok_nazov, prispevok_text
tabluka OBCE_PRISPEVKY [u]obec_id(index), prispevok_id(index)[/u],
tabuľka OBCE - [u]obec_id (primarny)[/u], obec_nazovale este predtym skus nastav table engine na InnoDB (rychlejsie pracuje s joinami) a kazdy index ktory sa pozuiva pri JOIN musi byt zaindexovany v tvojom pripade prispevok_id, prispevok_obec_id, obec_id
Kód: Vybrať všetko
Lebo ak som dotaz správne pochopil, ja vlastne spájam dve tabuľky čo spraví 30000x10000, preto to zrejme toľko trvá.Re: MySQL vypis z tabulky podla kategorii v inych tabulkach
Ďakujem ti krásne za odpoveď sorien, vyzerá, že to ide už ok (dopyt okolo tej 1 sekundy). Nevedel som, že je potrebné niečo také nastavovať v tabuľke MySQL, ani som tie indexy nepoznal.
Spravil som to teda takto:
(30000) tabuľka PRISPEVKY - prispevok_id(primary), prispevok_obec_id(index), prispevok_datum, prispevok_nazov, prispevok_text
(10000) tabuľka OBCE - obec_id(primary), obec_nazov
Keď s tým budem mať ešte problém, ozvem sa, lebo zatiaľ mám len pseudonáhodné dáta v tabuľke
//autoeditácia príspevku (25 Jún 2011, 13:54)
Kde môže byť prosím problém v rýchlosti? Neviem si už rady znovu. DB má 60MB.
Keď spravím
(40000) tabuľka PRISPEVKY - prispevok_id(primary), prispevok_obec_id(index), prispevok_kategoria1, prispevok_kategoria2, prispevok_datum, prispevok_nazov, prispevok_text
(10000) tabuľka OBCE - obec_id(primary), obec_nazov
SELECT * FROM PRISPEVKY, OBCE WHERE PRISPEVKY.prispevok_obec_id = OBCE.obec_id AND prispevok_kategoria = 1 ORDER BY PRISPEVKY.prispevok_datum DESC LIMIT 35000, 15
Trvá to 22sec, 38476 výsledkov.
Samozrejme ja indexujem dátum, čiže prispevok_datum dám index:
(40000) tabuľka PRISPEVKY - prispevok_id(primary), prispevok_obec_id(index), prispevok_kategoria1, prispevok_kategoria2, prispevok_datum(index), prispevok_nazov, prispevok_text
(10000) tabuľka OBCE - obec_id(primary), obec_nazov
rovnaký dotaz
Vtedy to trvá tak 1 sec, 38476 výsledkov. S týmto som spokojný, ale ak dám dotaz kde je málo výsledkov, dlho to trvá:
(40000) tabuľka PRISPEVKY - prispevok_id(primary), prispevok_obec_id(index), prispevok_kategoria1, prispevok_kategoria2, prispevok_datum(index), prispevok_nazov, prispevok_text
(10000) tabuľka OBCE - obec_id(primary), obec_nazov
SELECT * FROM PRISPEVKY, OBCE WHERE PRISPEVKY.prispevok_obec_id = OBCE.obec_id AND prispevok_kategoria = 5 ORDER BY PRISPEVKY.prispevok_datum DESC LIMIT 0, 15
Vtedy to trvá tak 1 sec, 5 výsledkov. Zdá sa mi to veľa.
Odoberiem index dátumu, a pridám indexy dvoch kategórií:
(40000) tabuľka PRISPEVKY - prispevok_id(primary), prispevok_obec_id(index), prispevok_kategoria1(index), prispevok_kategoria2(index), prispevok_datum, prispevok_nazov, prispevok_text
(10000) tabuľka OBCE - obec_id(primary), obec_nazov
SELECT * FROM PRISPEVKY, OBCE WHERE PRISPEVKY.prispevok_obec_id = OBCE.obec_id AND prispevok_kategoria = 5 ORDER BY PRISPEVKY.prispevok_datum DESC LIMIT 0, 15
Vtedy to trvá tak 0,05 sec, 5 výsledkov. Toto sa mi páči, len je potom problém ak s touto štruktúrou dám dotaz na kategóriu 1, kde je veľa výsledkov:
čas sa zvýši na 24sekúnd. Ak aj pridám indexovať dátum, nič to nezmení na pomalosti.
Zdá sa mi to divné a problém je zrejme niekde v ORDER. Ale predsa keď indexujem dátum(je v tvare UNIX), tak sort má byť hneď nie? A nemali by tomu robiť problémy keď pridám indexy dvoch kategórií.
Spravil som to teda takto:
(30000) tabuľka PRISPEVKY - prispevok_id(primary), prispevok_obec_id(index), prispevok_datum, prispevok_nazov, prispevok_text
(10000) tabuľka OBCE - obec_id(primary), obec_nazov
Keď s tým budem mať ešte problém, ozvem sa, lebo zatiaľ mám len pseudonáhodné dáta v tabuľke
//autoeditácia príspevku (25 Jún 2011, 13:54)
Kde môže byť prosím problém v rýchlosti? Neviem si už rady znovu. DB má 60MB.
Keď spravím
(40000) tabuľka PRISPEVKY - prispevok_id(primary), prispevok_obec_id(index), prispevok_kategoria1, prispevok_kategoria2, prispevok_datum, prispevok_nazov, prispevok_text
(10000) tabuľka OBCE - obec_id(primary), obec_nazov
SELECT * FROM PRISPEVKY, OBCE WHERE PRISPEVKY.prispevok_obec_id = OBCE.obec_id AND prispevok_kategoria = 1 ORDER BY PRISPEVKY.prispevok_datum DESC LIMIT 35000, 15
Trvá to 22sec, 38476 výsledkov.
Samozrejme ja indexujem dátum, čiže prispevok_datum dám index:
(40000) tabuľka PRISPEVKY - prispevok_id(primary), prispevok_obec_id(index), prispevok_kategoria1, prispevok_kategoria2, prispevok_datum(index), prispevok_nazov, prispevok_text
(10000) tabuľka OBCE - obec_id(primary), obec_nazov
rovnaký dotaz
Vtedy to trvá tak 1 sec, 38476 výsledkov. S týmto som spokojný, ale ak dám dotaz kde je málo výsledkov, dlho to trvá:
(40000) tabuľka PRISPEVKY - prispevok_id(primary), prispevok_obec_id(index), prispevok_kategoria1, prispevok_kategoria2, prispevok_datum(index), prispevok_nazov, prispevok_text
(10000) tabuľka OBCE - obec_id(primary), obec_nazov
SELECT * FROM PRISPEVKY, OBCE WHERE PRISPEVKY.prispevok_obec_id = OBCE.obec_id AND prispevok_kategoria = 5 ORDER BY PRISPEVKY.prispevok_datum DESC LIMIT 0, 15
Vtedy to trvá tak 1 sec, 5 výsledkov. Zdá sa mi to veľa.
Odoberiem index dátumu, a pridám indexy dvoch kategórií:
(40000) tabuľka PRISPEVKY - prispevok_id(primary), prispevok_obec_id(index), prispevok_kategoria1(index), prispevok_kategoria2(index), prispevok_datum, prispevok_nazov, prispevok_text
(10000) tabuľka OBCE - obec_id(primary), obec_nazov
SELECT * FROM PRISPEVKY, OBCE WHERE PRISPEVKY.prispevok_obec_id = OBCE.obec_id AND prispevok_kategoria = 5 ORDER BY PRISPEVKY.prispevok_datum DESC LIMIT 0, 15
Vtedy to trvá tak 0,05 sec, 5 výsledkov. Toto sa mi páči, len je potom problém ak s touto štruktúrou dám dotaz na kategóriu 1, kde je veľa výsledkov:
čas sa zvýši na 24sekúnd. Ak aj pridám indexovať dátum, nič to nezmení na pomalosti.
Zdá sa mi to divné a problém je zrejme niekde v ORDER. Ale predsa keď indexujem dátum(je v tvare UNIX), tak sort má byť hneď nie? A nemali by tomu robiť problémy keď pridám indexy dvoch kategórií.
Re: MySQL vypis z tabulky podla kategorii v inych tabulkach
kazdy index na stlpec, ktory sa pouziva v joine a where casti casti sql query ti urychli najdenie hodnoty, na order a group to ma minimalny/ziadny vplyv, len tu nastane problem, lebo nemozes zaindexovat celu tabulku, kazdy novy index ti vytvori subor s indexami na disku potom mysql ho musi s nim pracovat (citanie, prenasanie v pamati, cache, uvolnovanie, rebuild pre update/insert atd.) co su tiez casovo/pamatovo narocne operacie a moze sa ti kludne stat, ze data sa budu vyhladavat dlhsie ako v tabulke s mensim poctom indexov preto treba zvolit akysi kompromis.
spustas to na lokale? vela zalezi aj od nastavenia mysql servera ako ma nastavene cacheovanie
na tom tvojom query nevidim niaky problem ale tak skus este trochu zoptimalizovat
1. vsetky stlpce musia mat pevnu velkost tj. ziadne "TEXT" ale VARCHAR(xxx) ak chces pozuivat text tak do separatnej tabulky (najlepsie vsetky varchar, blob, text do separatnej tabulky) ti ukaze doporucene typy pre stlpce
2. raz za cas je vhodne zavolat
3. SELECT * FROM sa nepouziva, * sa nahradza stlpcami, ktore pouzivas
4. nieco som ti nasiel skus si precitat
spustas to na lokale? vela zalezi aj od nastavenia mysql servera ako ma nastavene cacheovanie
na tom tvojom query nevidim niaky problem ale tak skus este trochu zoptimalizovat
1. vsetky stlpce musia mat pevnu velkost tj. ziadne "TEXT" ale VARCHAR(xxx) ak chces pozuivat text tak do separatnej tabulky (najlepsie vsetky varchar, blob, text do separatnej tabulky)
Kód: Vybrať všetko
SELECT * FROM `tvoja tabulka` PROCEDURE ANALYSE()2. raz za cas je vhodne zavolat
Kód: Vybrať všetko
OPTIMIZE TABLE `tvoja tabulka`4. nieco som ti nasiel skus si precitat
Kód: Vybrať všetko
http://dev.mysql.com/tech-resources/presentations/presentation-oscon2000-20000719/index.html