Autor Zpráva
Petr-K
Profil *
Opět vás tu v krátké době zdravím…
UNIQUE jsem po mém minulém dotazu snad pochopil, ale pořád se motám mezi indexy. Pročítám manuál, e-booky na googlu i wiki a potřeboval bych od vás objasnit pár věcí jak tyto indexy fungují… :)

1) Pokud v dotazu použiji klauzuli ORDER BY, tak v daném dotazu mi jsou všechny indexy k ničemu, protože data jsou setříděna jinak než MySQL očekává?? Viz. e-book, strana 153
2) Druhý dotaz nevím jak přesně formulovat. Ale týká se PRIMARY KEY a automatického číslování záznamů. Když v dotazu nevyužívám žádný index, tak pomáhá si mysql nějakým způsobem tímto primárním klíčem? A nebo ho bere jen v úvahu, pokud vyhledávám data nad tímto sloupcem?

Moc vám děkuji za rady a pokud máte nějaké tipy z praxe jak na indexy, rád se dozvím něco nového.
TomášK
Profil
Petr-K:
1, Ne. Data se nejdřív poskládají a pak teprve řadí. Poskládání dat proběhne stejně jako bez ORDER BY. Pro řazení se můžou použít indexy, pokud jsou k dispozici. Ukázka říká, že záleží na pořadí v indexu, tedy INDEX(last_name, first_name) je nanic, když chceme řadit ORDER BY first_name, last_name. Abychom řazení zrychlili, museli bychom mít index (first_name, last_name).

2, Primary key na sloupci si lze představit jako kombinaci UNIQUE, NOT NULL, s omezením, že na jedné tabulce může být jen jeden primární klíč. Pokud se sloupcem, na kterým je primární klíč, v dotazu nepracujete, pak se ani index na něm celkem logicky nepoužije.

Je dobré pochopit, jak databáze ukládá indexy (B-stromy, bitmapy, ...). Lépe se pak představuje k čemu a jak by je mohla používat.
Petr-K
Profil *
TomášK:
Děkuji Ti za reakci, je jasné návrh databáze musíme pořádně promyslet a i dotazy nad ní optimalizovat abychom využili maximálního výkonu, ale i přesto...
Bod 1) mi stále není zcela jasný. To že se v ukázce z knihy mluví o důležitosti pořadí v indexu je mi jasné, to jsem z toho pochopil. Ale nepochopil jsem jak je to ovlivněno klauzuli ORDER BY.
- INDEX (last_name, first_name) a ORDER BY last_name, first_name = vše je OK, zrychlí prohledávání tabulky
- INDEX (last_name, first_name) a ORDER BY first_name, last_name = tato varianta je ale "problém", protože se "rozhodím" index (nevím jak to správně pojmenovat)

Budu-li mít jednoduchý index tak (podle knihy i podle tvé odpovědi):
- INDEX last_name a ORDER BY last_name = vše je OK, zrychlí prohledávání tabulky
- INDEX last_name a ORDER BY first_name, last_name = nezrychlí prohledávání tabulky (mně to totiž připadne funkčně stejné jako předchozí druhá varianta se složeným indexem).

Omlouvám se za mou nechápavost, ale rád bych tomu porozuměl... :)

PS: máš nějaký zajímavý odkaz na B a T-stromy, krom manuálu MySQL?
TomášK
Profil
Odkaz na reprezentaci indexů nemám, ale v různých databázích to bude podobné. V kostce (občas si dovolím něco zanedbat): mějme tabulku s milionem záznamů se sloupci a, b ve kterých jsou čísla od 1 do 1000. Pokud tabulce hledám záznamy s a = 5, musím projít záznam po záznamu celou tabulku, což je pomalé. Co s tím?

Vytvořím si pole a do i-té položky zapíšu záznamy (resp. ukazatele na místo, kde na disku jsou), které mají hodnotu a = i. Pokud se mě někdo nyní zeptá na záznamy s hodnotu a = 5, kouknu do páté položky a hned odpovím. Pokud někdo bude chtít všechny záznamy seřazené podle sloupce a, pak projedu pole od začátku do konce a vždy vypíšu všechny záznamy v dané přihrádce (bez pole bych musel řadit celou tabulku).

Pokud se mě někdo zeptá na záznamy, které mají a = 5 a b = 3, kouknu do páté přihrádky (kde je pořád ještě spousta záznamů), všechny je projdu a najdu mezi nimi ty, které mají hodnotu b = 3. Nic moc - problém je, že v položce 5 jsou záznamy neuspořádané. Vytvořím tedy další pole (pro každou položku) a na j-tou položku uložím záznamy s b = j. Nyní když se mě někdo zeptá na záznamy, které mají a = 5 a b = 3, kouknu na 5. položku původního pole, dostanu pole záznamů, které mají a=5, v tomhle poli kouknu na 3. položku a tam jsou záznamy, které hledám. Když někdo bude chtít všechny záznamy setříděné podle a, b - propak projedu pole od začátku do konce a vždy vypíšu všechny záznamy v dané přihrádce (které jsou nyní seřazené podle b). Když někdo bude chtít řadit podle b (natož b,a), tak mám smůlu, na to tuhle strukturu nedokážu využít (což je analogie INDEX last_name a ORDER BY first_name, last_name).

První odstavec popisuje index nad sloupcem a, druhý (a,b). Ve skutečnosti se nepoužívá pole, protože by bylo moc velké (je indexované hodnotami ve sloupcích), ale vhodnější datová struktura - nejčastěji B-stromy, které ale dělají v podstatě totéž. Trochu speciálně se chovají indexy nad řetězci, aby je šlo používat i s LIKE.

Indexy je tedy možno využívat (mimo jiné) pro vyhledávání v tabulce podle daného sloupce a pro řazení tabulky. Je dobré tyhle věci nedávat dohromady. V té knize nemají pravdu v posledním dotazu té kapitoly dobrou formulaci - index se tam použije k vyhledávání podle jména, ale už myslím ne k řazení (ale jen kvůli tomu, že se pracuje s řetězci, jinak by šel využít i k řazení - protože bychom pracovali se záznamy v jedné přihrádce pole, které máme seřazené podle first_name).
Kajman_
Profil *
Petr-K:
protože se "rozhodím" index
Index si nerozhodíte, jen prostě mysql složený index (last_name, first_name) na tento dotaz nevyužije. A ten jednoduchý také nelze v tomto případě použít.

máš nějaký zajímavý odkaz na B a T-stromy
Často jsou takovéto obecné věci srozumitelně popsané na wikipedii. V angličtině často podrobněji.
Petr-K
Profil *
TomášK:
waw, děkuji za detailní popsání, budu si to muset ještě jednou, dvakrát přečíst, abych to pořádně pochopil. Ale myslím ze to bude dobré :)
Ještě jednou děkuji za práci, kterou jsi tomuto příspěvku věnoval.
Petr-K
Profil *
Kajman:
No, rozhození není zrovna ten správný výraz, který jsem měl použít. Takže má doměnka byla správná, když jsem napsal, že v tomto přápadě "INDEX last_name a ORDER BY first_name, last_name" mi index moc nepomůže.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: