Autor Zpráva
fos4
Profil
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
peta
Profil
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
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..
fos4
Profil
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
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.

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:

0