Autor | Zpráva | ||
---|---|---|---|
Petr-K Profil * |
#1 · Zasláno: 10. 3. 2011, 21:49:35
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 |
#2 · Zasláno: 10. 3. 2011, 22:53:03
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 * |
#3 · Zasláno: 11. 3. 2011, 14:06:17
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 |
#4 · Zasláno: 11. 3. 2011, 15:31:23
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 * |
#5 · Zasláno: 11. 3. 2011, 15:35:28
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 * |
#6 · Zasláno: 11. 3. 2011, 15:59:19
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 * |
#7 · Zasláno: 11. 3. 2011, 16:06:57
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. |
||
Časová prodleva: 13 let
|
0