Stránka: 1 z 1
| [ Príspevkov: 8 ] | |
Autor | Správa |
---|
Registrovaný: 01.05.05 Príspevky: 13416 Témy: 1494 | 1494 Bydlisko: Bratislava |
Potreboval by som vediet ako zistim na ake stlpce mam dat index? Precital som si o tom niekolko clankov ale som z toho uplny jelen tabulky obsahuju len int, jedna tabulka obsahuje aj varchar, mam dat indexy na vsetky stlpce ktore pouzivam pri vybere? alebo mi staci len primarny na id a o vsetko sa stara mysql server? Moje terajsie riesenie pri selecte som pracoval s tabulkou kde som mal do 100 zaznamov, takze krasne a rychle generovanie stranky. Napadlo ma ale co v pripade ak tam bude tych zaznamov viac, tak som si tam vygeneroval nahodne asi 60000 zaznamov. Dana tabulka ma okolo 90 stlpcov, na zaklade troch stlpcov vyberam data zaroven z dalsich troch tabuliek a dosadzujem za ich id dane nazvy. Kde vsade by som mal dat index a aky? Skusal som index na stlpce ktore pouzivam pri vyhladavani za WHERE stlpec OR stlpec.....takych stlpcov tam je do 10, ale cas generovania sa nezmenil, takze su tie indexy predpokladam zbytocne... ?
_________________ Streacom DA2 | SilverStone Titanium SX800-LTI 800W | ASRock X299E-ITX/ac | Intel Core i9-9980XE & be quiet! Dark Rock TF | Kingston HyperX Impact 64 GB DDR4 2666 MHz | NVIDIA Titan RTX 24 GB | Intel SSD Optane 905P 480 GB NVMe U.2 & Intel SSD 750 1,2 TB NVMe U.2 & Intel SSD 660p 2 TB NVMe M.2 & Seagate BackUp Plus Portable 56 TB USB | 55" 4K OLED Dell Alienware AW5520QF | Ergotron LX Wall Mount Keyboard Arm | Logitech Craft | Logitech G603 | Logitech F710 | Harman Kardon Sabre SB 35 & Sennheiser RS 175 | Microsoft Windows 11 Enterprise | APC Back-UPS BE-850 VA | Lenovo ThinkPad X250 & Microsoft Windows 11 Professional | iPhone 15 Pro 256 GB & Pitaka Aramid | SilverStone ML05B Milo | Corsair SF600 SFX 600W | ASRock X99E-ITX/ac | Intel Xeon E5-2683 v4 & NOCTUA NH-L12S | Kingston HyperX Savage 32 GB DDR4 2400 MHz | NVIDIA GeForce GT 710 1 GB | Intel SSD Optane Memory 32 GB NVMe M.2 & Intel SSD 730 240 GB SATA | Ubuntu 24.04.1 LTS |
|
Registrovaný: 13.11.07 Prihlásený: 20.08.16 Príspevky: 1702 Témy: 0 | 0 |
Index použiješ všade, kde to má zmysel. Ak nejaká SQL požiadavka musí prejsť všetky stĺpce, tak je index zbytočný (a OR môže byť práve takýto prípad, záleží od použitia). Ak niekde používaš stĺpec, alebo skupinu stĺpcov, tak má má zmysel urobiť index (index sa dá urobiť aj z viacerých stĺpcov, vhodné je to hlavne vtedy, keď sa pri tých stĺpcoch často používa AND). // Spojený príspevok Str 19.11.14 12:03Ešte som zabudol, že môžeš použiť príkaz EXPLAIN (prípadne EXPLAIN EXTENDED) a zistíš, či sa ti tam tie indexy používajú. (ako sa používa výsledok toho príkazu nájdeš na internete )
|
|
Registrovaný: 01.05.05 Príspevky: 13416 Témy: 1494 | 1494 Bydlisko: Bratislava |
Ok vdaka vyskusam, teraz sa tak hram s tymi idexami pri jednej tabulke, vygeneroval som si tam vyse 5 000 000 riadkov a vyberam vzdy na zaklade dvoch stlpcov, vsimol som si ze pri indexe mam mohutnost a z 5000000 je pri jednom stlpci nieco okolo 20 000 a pri druhom okolo 10 000, ak tomu spravne chapem. Tak dany select neprehladava celu databazu ale siahne najprv na tieto indexy a preto sa select spracuje rychlejsie? Trochu som si o tom precital a nejak takto to asi chapem, je tomu tak? //ale asi to tak bude, skusam teraz inu tabulku a davam tam indexy postupne podla toho ako sa vyhladavaju, tak pri prvom kde to bez indexu trvalo 0,120sekundy to teraz spracuje za 0,019sekundy, ale mam tam len 20 tisic zaznamov, skusim aj tam pridat aspon pol miliona ze ako sa to bude spravat... Dokonca som zistil ze ak je pouzitych vela "OR stlpec =" pri jednom stlpci tak je vykonnejsie pouzit stlpec IN (...) alebo stlpec IN NOT (...), pri 5 milionoch sa mi takto select s vela OR na ten isty stlpec spracovalo za skoro 4 sekundy, pri IN (...) sa spracoval do pol sekundy, fakt su indexy silna vec pri optimalizacii vykonu aj v pripade neoptimalizovanych selectov ako tak zistujem. By ma zaujimalo kolko ludi sa vobec o to zaujima, jasne ze pri par zaznamoch v tabulke sa nema ani vyznam nad tym zamyslat, ale pri tisicovych az milionovych zaznamoch je to skutocne vidiet Skusil som nastavit rozsah pri selecte s dost vela OR aby som dostal vo vypise aspon viac ako 10 tisic zaznamov z asi 600 tisic a spracovanie trvalo skoro minutu, pri zmene z xy OR pri jednom stlpci som to vymenil a stlpec IN () a select sa spracoval za 4,2 sekundy, co je fantasticke este za kratsie to uz asi nedam, ci? ma nejaky vyznam spravit index zvlast na stlpce a aj spolocne? aky je medzi tym rozdiel?
_________________ Streacom DA2 | SilverStone Titanium SX800-LTI 800W | ASRock X299E-ITX/ac | Intel Core i9-9980XE & be quiet! Dark Rock TF | Kingston HyperX Impact 64 GB DDR4 2666 MHz | NVIDIA Titan RTX 24 GB | Intel SSD Optane 905P 480 GB NVMe U.2 & Intel SSD 750 1,2 TB NVMe U.2 & Intel SSD 660p 2 TB NVMe M.2 & Seagate BackUp Plus Portable 56 TB USB | 55" 4K OLED Dell Alienware AW5520QF | Ergotron LX Wall Mount Keyboard Arm | Logitech Craft | Logitech G603 | Logitech F710 | Harman Kardon Sabre SB 35 & Sennheiser RS 175 | Microsoft Windows 11 Enterprise | APC Back-UPS BE-850 VA | Lenovo ThinkPad X250 & Microsoft Windows 11 Professional | iPhone 15 Pro 256 GB & Pitaka Aramid | SilverStone ML05B Milo | Corsair SF600 SFX 600W | ASRock X99E-ITX/ac | Intel Xeon E5-2683 v4 & NOCTUA NH-L12S | Kingston HyperX Savage 32 GB DDR4 2400 MHz | NVIDIA GeForce GT 710 1 GB | Intel SSD Optane Memory 32 GB NVMe M.2 & Intel SSD 730 240 GB SATA | Ubuntu 24.04.1 LTS |
|
Registrovaný: 29.10.07 Prihlásený: 27.10.23 Príspevky: 1395 Témy: 30 | 30 Bydlisko: Bratislava |
Ak OR funguje pomalsie ako IN, tak je asi nejaky problem s databazou "Normalna" by si obe podmienky mala vediet vyhodnotit rovnako... ale to len na okraj. Spravny navrh indexov chce cit a skusenosti. Vseobecne musis analyzovat vsetky dotazy (hlavne narocne) aby si vedel posudit s ktorymi stlpcami mas v indexoch pocitat. Hlavne sa zameraj na to, ktore stlpce pouzivas pri spajani tabuliek a na ktore stlpce casto pouzivas podmienky (pri narocnych dotazoch). Neviem ako to je v MariaDB ktoru zrejme pouzivas, ale databazy standardne vedia pouzit iba jeden index pre kazdu tabulku/spojenie tabuliek. Cize ak mas dotaz... Kód: SELECT * FROM table WHERE a = '1' AND b = '2' AND c = '3' ... tak je zbytocne robit 3 rozne indexy (na kazdy stlpec zvlast). Treba spravit jeden index v ktorom budu vsetky 3 polozky... za prepdokladu ze to ma vyznam Databazy obycajne pouzivaju index zlava doprava. Cize ak budes mat index na stlpce a+b+c, tak ho databaza pouzije aj na vyber kde je podmienka iba na stlpce "a" a "b"... ak budes mat ale podmienku na "b" a "c", pricom na stlpec "a" podmienku nedas, index na a+b+c nebude pouzity. Zalezi teda na poradi. Ak stlpec "a" nepouzivas do podmienky pri vsetkych dotazok, bude lepsi index b+c+a. Okolnosti je samozrejme viac, je za tym hotova veda. Ale skutocnu optimalizaciu a spravne indexy asi nespravis, kym nebudes mat nejaky nastroj na analyzu strategie ktoru databaza pri konkretnych dotazoch vyberie. Stava sa totiz ze databaza vyberie "nespravny" index (iny nez by si chcel)... vtedy treba casto prepisat dotaz, niekedy pridat aj "zbytocnu" podmienku, vdaka ktorej uz vyberie ten spravny index a podobne. Ale taketo ftakoviny ries az ked budes mat vykonnostne problemy
_________________ PC: OS: Windows 11 (64bit) CPU: AMD Ryzen 5 3600 GPU: ASUS TUF RTX3060Ti 8GB RAM: 16GB DDR4-3200MHz Kingston Fury MB: ASUS TUF Gaming B550M WIFI SSD: 1000GB PCIe M.2 NVME Mobil: Xiaomi POCO F2 PRO |
|
Registrovaný: 01.05.05 Príspevky: 13416 Témy: 1494 | 1494 Bydlisko: Bratislava |
No ja som tam mohol vygenerovat podmienku s OR stlpec = asi 100x a niekde na nete, tusim vrana.php.cz ci ako sa vola jeho web tam tiez niekto spominal ze ak je vela ORov na jeden stlpec tak je efektivnejsie pouzit IN (..) tak neviem, ale s IN mi ten select trva na nepoznanie rychlejsie. Je mi jasne ze s indexami sa budem hrat isto velmi dlho kym to spravim nejak dobre, ono pri par tisic riadkoch je rychlost stale porovnatelna, mna ale zaujimalo ze ako sa to bude chovat pri par milionoch, kedze je mozne ze sa k takym cislam dostanem. No ale ak mam pouzity index na tri stlpce sucasne, tak ak budem vyhladavat len podla jedneho stlpca, tak sa ten index tiez vyuzije, alebo musim vyhladavat naraz podla vsetkych stlpcov? lebo ja tam mam viac rieseni, vyhladava podla jedneho, podla druheho a podla tretieho + inych stplcov a tie ine su pouzite sucasne aj pri jednom a druhom aj tretom. Zas viac indexov sposobi vyrazne spomalenie hlavne pri ukladani ak som tomu spravne pochopil...skrz aktualizacie celeho indexu. No veda to teda je ako zistujem, ale vidim ze tomu budem musiet tiez venovat pozornost, lebo k tym par desiatkam milionom zaznamov by som sa chcel dostat, len neviem co potom dalej, take nieco mi uz webhosting asi nezozere hej ja viem ze take kraviny riesit ked sa k takym cislam dostanem, mna to ale len zaujimalo a lepsie to spravit hned ked viem ako potom patrat ak sa nahodou k takym cifram dostanem // Spojený príspevok Štv 20.11.14 20:13Este taka otazka, da sa nejak urychlit COUNT z takeho mnozstva zaznamov? lebo na jednej stranke cez count zobrazuje asi 10 informacii podla stlpcov a tu stranku nacitava niekolko sekund ked tam je cez par milionov zaznamov.... Da sa to nejak urychlit?
_________________ Streacom DA2 | SilverStone Titanium SX800-LTI 800W | ASRock X299E-ITX/ac | Intel Core i9-9980XE & be quiet! Dark Rock TF | Kingston HyperX Impact 64 GB DDR4 2666 MHz | NVIDIA Titan RTX 24 GB | Intel SSD Optane 905P 480 GB NVMe U.2 & Intel SSD 750 1,2 TB NVMe U.2 & Intel SSD 660p 2 TB NVMe M.2 & Seagate BackUp Plus Portable 56 TB USB | 55" 4K OLED Dell Alienware AW5520QF | Ergotron LX Wall Mount Keyboard Arm | Logitech Craft | Logitech G603 | Logitech F710 | Harman Kardon Sabre SB 35 & Sennheiser RS 175 | Microsoft Windows 11 Enterprise | APC Back-UPS BE-850 VA | Lenovo ThinkPad X250 & Microsoft Windows 11 Professional | iPhone 15 Pro 256 GB & Pitaka Aramid | SilverStone ML05B Milo | Corsair SF600 SFX 600W | ASRock X99E-ITX/ac | Intel Xeon E5-2683 v4 & NOCTUA NH-L12S | Kingston HyperX Savage 32 GB DDR4 2400 MHz | NVIDIA GeForce GT 710 1 GB | Intel SSD Optane Memory 32 GB NVMe M.2 & Intel SSD 730 240 GB SATA | Ubuntu 24.04.1 LTS |
|
Registrovaný: 13.11.07 Prihlásený: 20.08.16 Príspevky: 1702 Témy: 0 | 0 |
Môžeš mať index pre stĺpec A, pre stĺpec B, pre A+B... (samozrejme čím viac ich bude, tým pomalšie bude vkladanie dát do DB, takže ideálne je mať index len na to, čo sa naozaj používa).
|
|
Registrovaný: 01.05.05 Príspevky: 13416 Témy: 1494 | 1494 Bydlisko: Bratislava |
Takze ak v nejakej tabulke vyberam len podla dvoch stlpcov tak je lepsie mat A+B ako v inej tabulke kde vyberam data bud podla stlpcu A, alebo B, alebo C ? Ci v oboch pripadoch je lepsie A+B, resp. A+B+C aj ked v tej druhej tabulke vyberam bud podla jedneho z tych stlpcov, alebo z dvoch ci zo vsetkych troch naraz? Tomu tak trochu nerozumiem, ze aky ma vyznam mat jeden index pre A+B ked ho mozem mat jeden na A a jeden na B, resp aky je medzi tym rozdiel?
_________________ Streacom DA2 | SilverStone Titanium SX800-LTI 800W | ASRock X299E-ITX/ac | Intel Core i9-9980XE & be quiet! Dark Rock TF | Kingston HyperX Impact 64 GB DDR4 2666 MHz | NVIDIA Titan RTX 24 GB | Intel SSD Optane 905P 480 GB NVMe U.2 & Intel SSD 750 1,2 TB NVMe U.2 & Intel SSD 660p 2 TB NVMe M.2 & Seagate BackUp Plus Portable 56 TB USB | 55" 4K OLED Dell Alienware AW5520QF | Ergotron LX Wall Mount Keyboard Arm | Logitech Craft | Logitech G603 | Logitech F710 | Harman Kardon Sabre SB 35 & Sennheiser RS 175 | Microsoft Windows 11 Enterprise | APC Back-UPS BE-850 VA | Lenovo ThinkPad X250 & Microsoft Windows 11 Professional | iPhone 15 Pro 256 GB & Pitaka Aramid | SilverStone ML05B Milo | Corsair SF600 SFX 600W | ASRock X99E-ITX/ac | Intel Xeon E5-2683 v4 & NOCTUA NH-L12S | Kingston HyperX Savage 32 GB DDR4 2400 MHz | NVIDIA GeForce GT 710 1 GB | Intel SSD Optane Memory 32 GB NVMe M.2 & Intel SSD 730 240 GB SATA | Ubuntu 24.04.1 LTS |
|
Registrovaný: 29.10.07 Prihlásený: 27.10.23 Príspevky: 1395 Témy: 30 | 30 Bydlisko: Bratislava |
vsetko zalezi od toho ako vyzeraju WHERE Podmienky. Ak mas podmienku na oba stlpce, potrebujes index na a+b. Ak spravis 2 samostatne indexy (jeden na "a" a druhy na "b"), tak nebudu pouzite oba. databaza sa nejako rozhodne ktory index je pre nu lepsi a pouzije ten. nedokaze pouzit oba. zalezi ale aj od toho ake su v tych stlpcoch data (vela rovnakych, alebo naopak vacsinou jedinecne hodnoty), a od toho aku strukturu indexu zvolis (btree, hash...) Neda sa generalizovat a povedat bez detailov ze co je lepsie riesenie.
_________________ PC: OS: Windows 11 (64bit) CPU: AMD Ryzen 5 3600 GPU: ASUS TUF RTX3060Ti 8GB RAM: 16GB DDR4-3200MHz Kingston Fury MB: ASUS TUF Gaming B550M WIFI SSD: 1000GB PCIe M.2 NVME Mobil: Xiaomi POCO F2 PRO |
|
Stránka: 1 z 1
| [ Príspevkov: 8 ] | |
|