Databaze Mysql 2 milionu zaznamu
Zdravim, predem se omlouvam za diakritiku, nemam ceskou klavesnici.
Chtel bych se zeptat ohledne rychlosti MySql a dalsich databazi.
Mam 2 miliony zaznamu, coz je databaze geolokace podle ip adressy.
Mysql dotaz:
[pre]select * from geoLocation_blocks WHERE INET_ATON('5.5.5.5') BETWEEN startIpNum AND endIpNum LIMIT 1;[/pre]
1 row in set (1.25 sec)
Struktura tabulky
[ startIP (int 10 UNSIGNED) | endIP (int 10 UNSIGNED) | oblast (int 6 UNSIGNED)]
Nejde to jeste zrychlit? :) Nebo po tom chci moc? :P
Popripade bych si nechal doporucit jinou (rychlejsi) databazi. Ale obavam se ze pro tento dotaz uz moc rychlejsi nebude.
Dekuji predem za rady.
Z tohodle popisu se to špatně hádá - jednak nevidím exekuční plán, druhak nevím co je startIpNum AND endIpNum a jak je to s indexem Je to celá tabulka? Co se dělá za operaci? Partišnovani apod?
Nevim jak to měříš a k čemu to používáš a kolik je tam userů atd. Těžko něco hádat.
startIpNum a endIpNum jsou ipadresy zapsane ciselne. Viz INET_ATON() ktery mi vstupni ip adress vrati jako ciselnou. Index tam nemam zadny, jelikoz mi neprijde ze by se tam vyplatil. Ano je to cela tabulka. Provadim jen ten dotaz co jsem uvedl vyse.
Netusim co znamena Partišnovani :)
Cas mi vyhazuje terminal ve vystupu. Na poctu useru mi nezalezi. Potrebuji predevsim rychlost pro par rychlych dotazu.
LOL&ROFL.
Hlavně že nad tou tabulkou selektuješ..
V tom případě, se jede FULL TABLE SCAN. Tedy je čtena CELÁ TABULKA, pokud se čte jeden řádek tak by se to asi mohlo vyplatit indexovat, ne? Tak 2-3 datové bloky ke čtení místo 2milionové tabulky, ne?
Ja myslel ze Indexy funguji na principu ze se nejpouzivanejsi data zaindexuji a tim pri vyhledavani se zrychli dany process. Ale prepokladam ze u vyhledavani IP adress se tak casto stejne data opakovat nebudou.
Nebo Indexy funguji jinak?
ok, diky.. Asi jsem si spatne vylozil slovo Indexy :)
index je balance-tree struktura, která umožnuje rychle vyhledávat. Má to relaci na to kolik ruznych hodnot je ve sloupci, kolikrát je tam nully atd. Ale když pominu specialni případy, tak rozhodně nezávisí na tom, která data používáš,ve struktuře jsou indexovány všechny hodnoty mimo prázdných. V 2 milionové tabulce najdeš hodnotu do 2 max 3 ruznych čtení kde se dozvíš, kde je fyzicky řádek uložen +1 do tabulky.
Ne, to skoro vypadá jako, že si pleteš s CACHE, ne není tomu tak, indexuje se všechno co si nadikturuje programátor nezávisle na tom, jak je to pak používáno.
Hledáš nějaký interval IP (start-end), ale výsledek omezíš jen na jeden záznam (LIMIT 1). To jsem nepochopil.
Ano, jelikoz rozsahu v IP adresse odpovida prave jedno konkretni misto. (Oblast)
Kdyby rozsahu odpovídalo jen jedno místo, nemusel bys SELECT omezovat LIMITem.
Vic operacni pameti - vykonnejsí CPU - optimalizovat parametry MySQL. 2mil zaznamu neni zas tak moc.
bože - index, partišnování, indexově orientovaná tabulka, držení tabuky v paměti, ta funkce fakt nemusí být volaná tak často - přes proměnou, označení jako deterministic, LOOK UP tabulka v paměti, v oracle bych mluvil o RESULT CACHE atd - asi bžilion možností a ty mu nabídneš koupit novej hardware a optimalizovat celou instantci mysql..
Predpokladam, ze minimalne na StartIP je definovany clusterovany index (doufam, ze mySQL clusterovane indexy umi)
nemusi byt clustered. To je vacsinou Primary key. Staci ak zadefinuje na obe polia, ktore sluzia ako kriterium pre vyhladavanie nejake indexy. Pokial sa vsak v danych poliach dost casto opakuje ta ista hodnota (priklad, polia kde su len priznaky 0 a 1), tak index nema prakticky ziadny ucinok.
něco mi uniká nebo clusterovany index je v tom mssql co používáš něco jiného než v oracle?
clusterovany index je vsade to iste a teda to, ze podla daneho indexu su aj zaznamy realne zoradene.
Presne tak. A pokud se podle toho pole vetsinou vybira, ma tam ten index smysl - je vykonove rychlejsi nez obycejny index.
Už jsem zagooglil. Pravda je taková, že slovo "cluster" u Oracle je ale je to něco jiného - kombinace jedné (respektive 2, ale i více tabulek), kde na join sloupci jsou společně uloženy v stejnejch blocích. Proto mi to nedávalo smysl, neb dotaz je jen z jedné tabulky.
Co se týče seřazených záznamů, tak rozumím, jen my tomu u Oracle neříkáme clustered (a nevidim důvod, proč by se to tak mělo jmenovat (cluster = svazek)), ale IOT - indexově orientované tabulky,(co googlim není to uplně to samé, ale je to podobné). A v tom případě OK, IOT ano.
Ono to nebude od Cluster, ale od clustering, pripadne clustered
Ve svete MS SQL je to property indexu.
Pro tento konkretni pripad bych to udelal pouze na prvni sloupec, ne na oba. A verim, ze rychlost vyberu by se drasticky zrychlila.
Ok, diky - nevěděl jsem právě co to je, tak se ptám. Když tomu říkají v každé DB jinak je to složité.
Nedokážu bez dat říci, ale souhlasím - zrychlí se to, protože když bere jeden řádek z 2millionu a jsou tam uloženy IP tak index to pošle řádově dolu - vyběr konkrétního se už pak bude pohybovat jen v násobncích času, maximálně (pokud ho vysloveně nepokurví). Naprostý souhlas.
okrem indexu by jednou z optimalizacii mohlo byt to, ze INET_ACTION('5.5.5.5') nahradis za premennu. Teda najprv si do premennej hodis vystup z INET_ACTION('5.5.5.5') a az tu pouzijes do where. Zamedzis tym niekolkonasobnemu volaniu tej istej funkcie.
A nebo INET_ACTION označit jako DETERMINISTIC a databáze si jí v tomhle případě zavola jen jednou. Ovšem mluvime tu o MYSQL, které to asi neumí