Autor | Zpráva | ||
---|---|---|---|
fos4 Profil |
#1 · Zasláno: 8. 6. 2008, 21:22:16 · Upravil/a: fos4
Zdravím,
předpokládejme, že máme tabulku která má dva sloupce X a Y, (unsigned tynint) na sloupcích jsou indexy X, Y. Do tabulky vložíme mapu o rozměrech 100*100 a chceme vybrat: x > 20 AND x < 40 AND y > 20 AND y < 40. Když si vyjedy explain tak SQL hlasí: 1 SIMPLE map_1 ALL x,y 10000 Using where Pokud udělám indexy nad XY tak výsledek je mnohem lepší, ale ne uspokojivý: 1 SIMPLE map_1 range xy xy 1 1039 Using where Mohl by někdo poradit jak více vyladit dotaz ? Děkuji |
||
Časová prodleva: 4 dny
|
|||
peta Profil |
#2 · Zasláno: 12. 6. 2008, 16:02:20 · Upravil/a: peta
fos4
strukturu tabulky ala SQL i s indexy? Treba mas prvni zapis uz spatne. XY je lepsi, protoze svazuje X a Y V tom pripade bych zkusil zmenit zapis: x > 20 AND y > 20 AND x < 40 AND y < 40. A jeste by slo udelat to, ze "Do tabulky vložíme mapu o rozměrech 100*100" Vis-li presne rozmery, pak pozice bodu je dana rovnici: z = y*maxx + x; treba by se to dalo vyuzit. vzor struktury tabulky: CREATE TABLE tab ( `id` int(11) NOT NULL AUTO_INCREMENT, `room` int(11) default NULL, `type` int(11) default NULL, PRIMARY KEY(`id`), KEY (`room`), KEY (`type`) ) TYPE=MyISAM; Spis si myslim, ze mas spatne resene indexy, protoze 10.000 zaznamu nemuze prochazet s indexy jako 10000. A napada mne jedno takove zrychleni. Vime, ze oblast, kterou zobrazujes je 20x20 Jestlize teda ma mapa 100x100 a budes-li tam mit pouze zaznam, ze se na bode x,y nachazi pouze 1 objekt (mapa krajiny pro hru), polohu ostatnich objektu resi jina tabulka. Potom muzes tuhle mapu bud - rozdelit na plochy 20x20 a vzdy nacist 4 sousedni, ze kterych pak scriptem vykreslis, co potrebujes - celou mapu ulozit do promenne (AZaz09) "Azm57gvmwkgmzzeg" a scriptem vykreslit oblest, co potrebujes. PHP ma myslim pro cely script vyhrazene 2MB a 10k je naprosty pakatel, daleko vic maji sablony stranek. |
||
fos4 Profil |
#3 · Zasláno: 12. 6. 2008, 23:12:36
Index mam a to XY ale i tak to prochazi 1039 záznamu at vybiram jakkoli (tedy x > 20 AND y> 20 AND x < 40 AND y < 40 nebo i jinak).
Ale stim ulozeni do php, to je dobry napad, kdyz jeste pouziji Memcache tak by to mohlo slapat celkem dobre, snad lepe nez v table type memory.. |
||
Časová prodleva: 4 dny
|
|||
fos4 Profil |
#4 · Zasláno: 16. 6. 2008, 14:22:43 · Upravil/a: fos4
vyreseno ID = x * 10000 + y
WHERE ID in (10001,10002,10003,10004,10005,10006,10007,10008,10009,100010,100011,1 00012,100013,100014,100015,100016, 100017,100018,100019,100020,100021,100022,100023,100024,100025,100026, 100027,100028,100029,100030,100031,100032, 100033,100034,100035,100036,100037,100038,100039,100040,100041,100042, 100043,100044,100045,100046,100047,100048, 100049,100050) 50 projetych zaznamu |
||
Joker Profil |
#5 · Zasláno: 16. 6. 2008, 14:39:03
peta
celou mapu ulozit do promenne (...) a scriptem vykreslit oblest, co potrebujes. No co já vím, doporučuje se výpočty co nejvíc nechávat na databázích, které jsou na to optimalizované. Pochybuju, že simulovat tu WHERE podmínku v PHP bude rychlejší, než ji dát přímo do databáze. |
||
Časová prodleva: 16 let
|
0