[MySQL] Par otazok na MySQL

Programovacie jazyky, rady, poradňa...
Everhard
Light Expert
Light Expert
Príspevky: 79
Registrovaný: 25 dec 2010, 14:41

[MySQL] Par otazok na MySQL

Príspevok od používateľa Everhard »

Dobry. Mal by som par otazok na MySQL databazu. Bol by som rad, keby mi ich niekto predovsetkym skuseny vedel zodpovedat.

1. INDEX na stlpec - k comu su dobre? Ako docital som sa, ze pri dotaze SELECT sa nemusi citat priamo riadok(citat v zmysle examined - rows Number of rows mysql believes it must examine to get the data), ale ked je index, tak len sa prejde po indexoch. Ze to urychluje.
Znamena to, ze ak si to mozem pamatovo dovolit, dam index na kazdy stlpec (ktory je typu cisla) a budem mat databazu super rychlu? Alebo je potrebne vhodne volit stlpce kde dat index?

2. Co vobec znamena to "row count to be examined"? Nacitat riadok cely, so vsetkymi stlpcami do pamate RAM?

3. CACHE - na niektorych strankach som videl napisane "cachujeme udaje 1hodinu dozadu, tak mozu byt neaktualne" - nikde v databaze som nenasiel nastavenie, ktore obmedzuje nastavit cache cas, je to mozne?

4. VELKA DATABAZA - ako riesit problem velkej databazy pri web aplikacii, dam priklad:
ID (INT key) | UDAJ1 (INT index) | UDAJ2 (INT index) | UDAJ3 (VARCHAR 50) | UDAJ4 (VARCHAR 50) | UDAJ5 (VARCHAR 5000)

Lebo ak robim uplne obycajny dotaz na webhostingu, ktory si platim:

Kód: Vybrať všetko

SELECT id, udaj1, udaj2, udaj3, udaj4, udaj5
WHERE udaj1 = '5'
ORDER BY udaj2 DESC
LIMIT 6000, 15
Pri databaze s 100 000 riadkami je to dost pomale - priemer tak 0,07sec. Co si neviem predstavit keby som na webe mal cez 500 ludi (0,07*500=35sec spracovanie!).
Zistil som, ze problemom su tie varchary, a bohuzial neviem ako pracuje MySQL. Ci pri tom dotaze chyta celu databazu a dava ju do pamate RAM, tam ju celu usporaduva s tymi 5000 znakovymi varcharmi? Samozrejme som vyskusal som aj MEDIUMTEXT - ako je to pri tomto PHPBB3. Je to trochu rychlejsie ale stale 0,04s priemer co je pomale.

Docital som sa funkcie MySQL funkcie EXPLAIN, ktora vie napomoct. Ale velmi som nepochodil. Precital som uz cez 100 prispevkov na zahranicnych forach kde sa stazovali na pomalost ale neuspesne. Nikde som nevidel ako by to vyriesili.

Dik ked tak za odpovede.
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: [MySQL] Par otazok na MySQL

Príspevok od používateľa audiotrack »

1. index skutočne môže pomôcť. Teorie okolo indexov je plno, základ je však pochopiť čo to je a ako to funguje. Ak si naštuduješ niečo B stromoch, tak by si mal byť schopný pochopiť ako fungujú a aké majú nevýhody. Rozhodne neplatí, že dáš index na každý stlpec a bude rýchla. Bude ešte pomalšia ako bez nic, pretože každá aktualizácia záznamu /update, delete, insert/ musí zaktualizovať aj index. Používaj ich iba na tie stlpce, na ktorých robíš vyhľadávanie (čo sa ti objavuje vo where klauzule)

2. to by mal byť počet riadkov, ktoré treba načítať pre spracovanie výsledku. AK máš nejakú podmienku, tak by to mali byť všetky (pokiaľ sa nebavíme o pokročilých dbs). Ak máš len limit, tak iba počet v tom limite. Ak máš join, tak súčet riadkov z každej tabuľky čo spájaš a pod.

3. dá sa to nastaviť na mysql serveri, nie v phpmyadmine. Väčšinou sa s tým však v praxi nikdy (ako programátor) nestretneš. A v tomto kontexte ako si to napísal že to bolo na stránke asi bola reč o cachovaní pomocou nejakej php triedy, a nie priamo v mysql. Nie?

4. pre veľké texty ( ako tam máš varchar(5000) používaj radšej TEXT (a jeho varianty TINYTEXT a pod.). Konkrétne na tom tvojom query asi najväčšiu časť zaberá to zotrieďovanie. Pozri si spomínaný explain. Ešte by sa dal použiť na udaj5 hash index (a tie dva indexy čo nepoužívaš zmazať)
Everhard
Light Expert
Light Expert
Príspevky: 79
Registrovaný: 25 dec 2010, 14:41

Re: [MySQL] Par otazok na MySQL

Príspevok od používateľa Everhard »

Dik za odpoved. B stromy sme brali v skole pred par rokmi, ako funguju viem. Praveze ta moja realna DB ma asi 30stlpcov z toho na 15 sa da pytat vo vyhladavacom formulari - takze 15 indexov je asi prilis vela. Pride mi rozumne skor asi nechat index iba na tom, podla ktoreho to usporiadavam?

K tomu TEXT. Moj prispevok som este upravil a dopisal som tam ze som TEXT skusal, tak sa ospravedlnujem. Ten MEDIUMTEXT (podla toho ked som pozeral v akom formate drzi toto popularne PHPBB3 databazu - pri postoch pouzivaju MEDIUMTEXT), ale tak neviem. Zda sa mi to pomale. Neviem si to predstavit pri velkej navstevnosti. I ked je pravda, ze az 400 stranu a viac si malokedy clovek nalistuje (LIMIT 6000, 15).

Este som rozmyslal ci to nie je koli tym textom(text,varchar), ze sa to musi nacitavat do pamate? Alebo nemusi, neviem. Lebo neviem ako MySQL funguje. Rozmyslal som oddelit do jednej tabulky vyhladavacie prvky(vsetky INT a take) a do druhej tabulky dat (varchar+text). Dotaz spravit na tej prvej tabulke a JOINnut to na druhu pri 15 vysledkoch by to malo byt v pohode. Len problem je ze potom nemozem robit dotaz LIKE na text. Ale neviem ci je tento sposob vobec uzitocny. :/
manager666
Star
Star
Používateľov profilový obrázok
Príspevky: 642
Registrovaný: 12 aug 2007, 13:29

Re: [MySQL] Par otazok na MySQL

Príspevok od používateľa manager666 »

Ako uz audio nacrtol, pri optimalizacii je zasadne vediet ako to cele funguje. Odporucam nastudovat minimalne B+ stromy, (primary)primarny a (secondary)sekundarny index, (dense)husty a (sparse)riedky index; jednoducho vsetko okolo (ordered indices)usporiadanych indexov.
Bez poznania typicky ukladanych dat a celeho logickeho datoveho modelu odhadujem, ze by pomohlo na ID vytvorit primarny index(ako riedky) a na atribute UDAJ1 sekundarny index(ako husty). Viac k tomu moja vestiaca gula nema co dodat. :lol:
:wink:
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: [MySQL] Par otazok na MySQL

Príspevok od používateľa audiotrack »

na udaj1 by bol lepši hash index ako husty index. Z optimálneho využívania dbs u nás na FI MUNI si pamätám, že hash sa má používať na presnú zhodu (čo tam má) a indexy pre porovnávania (väčší, menší..). Pokiaľ tam nemá query iného charakteru ako to čo ukázal, tak je to krásny prípad na hashovanie a nie na indexy. Ale radiť ako má rozhodiť indexy a akú spraviť štruktúru tabuľky na základe jedného query je úplne pritiahnuté za vlasy. Veď ani nevieme čo chce, možno má celú tabuľku zle navrhnutú (nenormalizovanú v 3NF)
manager666
Star
Star
Používateľov profilový obrázok
Príspevky: 642
Registrovaný: 12 aug 2007, 13:29

Re: [MySQL] Par otazok na MySQL

Príspevok od používateľa manager666 »

audiotrack napísal:možno má celú tabuľku zle navrhnutú (nenormalizovanú v 3NF)
Co je dost pravdepodobne, tiez som na to myslel.

Everhard:
Cele je to vestenie... Bez znalosti minimalne logickeho datoveho modelu, typicky ukladanych dat a typickych dotazov(pouzivam cestinu, slovensky ekvivalent - dopyt mi nejde do ucha), sa ti neda konkretne poradit.
Everhard
Light Expert
Light Expert
Príspevky: 79
Registrovaný: 25 dec 2010, 14:41

Re: [MySQL] Par otazok na MySQL

Príspevok od používateľa Everhard »

Este by som sa rad opytal

5. Zalezi na poradi indexov ako ich mam pridane v phpmyadmin?

6. Kde v phpmyadmin nastavim hash index? taky tam nevidim. ani tieto ostatne
(primary)primarny a (secondary)sekundarny index, (dense)husty a (sparse)riedky index; jednoducho vsetko okolo (ordered indices)usporiadanych indexov.
7. audiotrack pisal si
možno má celú tabuľku zle navrhnutú (nenormalizovanú v 3NF)
po vselijakach forach aj po inych strankach ktore som pozeral pisali, ze ak chcem zvysit vykon rychlosti citania z databazy, mal by som tabulku normalizovat, a potom denormalizovat napr do tvaru star schema - http://en.wikipedia.org/wiki/Star_schema
Je rozumne vobec rozdelovat tabulku do viacero tabuliek. Ked dotaz obsahuje join, a to niekolko nasobny, trva to dost dlhsie nie?

8. tu je potom aj moja dalsia otazka, ak ma tabulka 100 000 riadkov, a mam stlpec kde je napr kategoria oblecenie - tricko, nohavice, bunda, topanky. Tak mam spravit tabulku kde dam ID_oblecenie,nazov. A hlavnu tabulku JOINovat na tuto s oblecenim pomocou ID? Lebo zase spajam tabulky a to dlho trva nie? Keby som dal do hlavnej tabulky aj ID_oblecenie aj nazov, bolo by to rychlejsie nie - vtedy ked chcem dopytovat na ID_oblecenie?
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: [MySQL] Par otazok na MySQL

Príspevok od používateľa audiotrack »

5. nie
6. hash index, bitmap index... to sú len konkrétne implementácie indexov. Ja som to bral z teoretickej roviny, nevšimol som si že píšeš konkrétne o mysql. To myslím že hash index používa ako defaultnú implementáciu. Riedky a hustý index nepridáš tiež, lebo to sú iba množiny veľa rôznych typov indexov. Ale ak dávaš index na primárny kľúč, tak je určite riedky a ak na iný atribút, tak je určite hustý
7. je to rozumné z dôvodu správneho návrhu. Ak ju nerozdelíš, môžeš neskôr naraziť na vážne problémy. 3. NF napríklad zaručuje aj atomickosť atribútov. Ak ju teda nemáš, znamená to že niektoré hodnoty čo tam eviduješ sa dajú dopočítať z iných hodnôt. Potom môže nastať taký problém, že túto hodnotu zle updatneš a budeš mať zapísanú hodnotu inú ako vypočítanú. Ktorá teraz platí? To je iba jeden z možných problémov nenormalizovaných databáz. Takže určite treba normalizovať. Denormalizácia je potom už zameraná na praktické hľadisko, a to presne veci ako píšeš. Niekedy je efektívnejšie porušiť napríklad atomickosť atribútov, ak vieš že ich vypočítanie je veľmi časovo náročné.
8. Pri takom riešení ako máš ale môžeš naraziť na problémy s aktualizáciou. Ak chceš zmeniť "tričká" na "tričko" tak to musíš zmeniť v každom riadku a v každom query kde sa na tričká pýtaš. Ak to bude podľa id, tak to zmeníš iba v tomto jednom riadku. Ďalší problém je, že ten vzťah čo si naznačil sa mi vôbec nejaví ako 1:1 ale N:M. Jedno oblečenie môže byť aj vo viac kategoriach, napríklad ak máš kategorie rifle a nohavice, tak som si istý že väčšina produktov patrí do oboch a nie len do jednej. Aj z hľadiska vyhľadávania produktov na stránke je dobré ich zaradiť do všetkých kategorii kam patrí a nie len do jednej, takže takúto spájaciu tabuľku určite budeš potrebovať. Tu sa nebavíme už o rýchlosti, ale o funkčnosti. Čo z toho že sa query vykoná o 0.0005 sekundy skôr, keď klientovi na "rifle" nezobrazí všetko čo tam patrí
ropman
Medium Professional
Medium Professional
Príspevky: 1250
Registrovaný: 12 apr 2010, 21:07

Re: [MySQL] Par otazok na MySQL

Príspevok od používateľa ropman »

treba davat index na primarny kluc ? ved defaultne ma kazda tabulka index na primarnom kluci, nie ?
audiotrack
VIP
VIP
Používateľov profilový obrázok
Príspevky: 25958
Registrovaný: 09 sep 2005, 18:39
Kontaktovať používateľa:

Re: [MySQL] Par otazok na MySQL

Príspevok od používateľa audiotrack »

samozrejme, zle som sa vyjadril :)
Napísať odpoveď