ugrás a tartalomhoz

Nézet tábla vagy Group by

MDOC · 2014. Feb. 26. (Sze), 12.07
Van egy netes játék, amely egy sql dump fileban adja meg a játékban lévő falvak infóit.

pl. http://ts1.travian.hu/map.sql

Ennek a szerkezete a következő:

CREATE TABLE `x_world` ( 
    `id` int(9) unsigned NOT NULL default '0', 
    `x` smallint(3) NOT NULL default '0', 
    `y` smallint(3) NOT NULL default '0', 
    `tid` tinyint(1) unsigned NOT NULL default '0', 
    `vid` int(9) unsigned NOT NULL default '0', 
    `village` varchar(20) NOT NULL default '', 
    `uid` int(9) NOT NULL default '0', 
    `player` varchar(20) NOT NULL default '', 
    `aid` int(9) unsigned NOT NULL default '0', 
    `alliance` varchar(8) NOT NULL default '', 
    `population` smallint(5) unsigned NOT NULL default '0', 
UNIQUE KEY `id` (`id`) );
ID: Number of the field, starts in the top left corner at the coordinate (-400|400) and ends in the bottom right corner at (400|-400).
X: X-Coordinate of the village.
Y: Y-Coordinate of the village.
TID: The tribe number. 1 = Roman, 2 = Teuton, 3 = Gaul, 4 = Nature and 5 = Natars
VID: Village number. The unique ID for the village.
Village: The name of the village.
UID: The player’s unique ID, also known as User-ID.
Player: The player name.
AID: The alliance’s unique ID.
Alliance: The alliance name.
Population: The village’s number of inhabitants without the troops.

Egy klánban több játékos is lehet és egy játékosnak több falva is. Ebben ugye falvanként van felsorolva minden infó. Eddig azt csináltam hogy ezt ahogy van beraktam egy táblába. Majd valahányszor egy játékos adataira voltam kíváncsi group by-al lekérdeztem(a népesség miatt).

Nem rég viszont létrehoztam 3 nézettáblát.

pl. a játékosokra ezt

CREATE VIEW `".$options['world_db_name']."_players` AS SELECT 
   `aid`,
   `alliance`,
   `uid`,
   `tid`,
   `player`,
   CONCAT(`player`,' [',`alliance`,']') AS `player_alliance`,
   SUM(`population`) AS `population`
FROM `".$options['world_db_name']."` GROUP BY `uid`;
Valamiért az az érzésem, hogy a nézettábla hatékonyabb, bár lehet ez hülyeség. Ezért szeretném megkérdezni, melyik a hatékonyabb? Van egyáltalán különbség?
 
1

View

Hidvégi Gábor · 2014. Feb. 26. (Sze), 12.30
Olvasd el, mik a view-k előnyei egy hagyományos SELECT-hez képest, aztán el tudod dönteni, van-e értelme használni vagy nincs.
2

Köszönöm a gyors választ. Az

MDOC · 2014. Feb. 26. (Sze), 12.47
Köszönöm a gyors választ. Az angolom messze nem tökéletes. Annak már eddig is utána olvastam, hogy mi a nézet tábla. Tudom, hogy ilyenkor egy utasítássorozat tárolódik el és hogy leginkább biztonsági okokból, valamint egyszerűsítésre érdemes használni. Könnyen lehet, hogy jelen esetben felesleges, bár kényelmesebb. Valamiért az van bennem, hogy mivel tárolódik az utasítássorozat, valamennyire optimalizál is a rendszer, a sima lekérdezéshez képest. Persze lehet, hogy a FROM után simán berakja a nézettábla létrehozásakor használt kódot.
3

Nem hogy gyorsabb lesz, de

bamegakapa · 2014. Feb. 26. (Sze), 13.35
Nem hogy gyorsabb lesz, de talán még lassabb is. Viszont biztonsági és átláthatósági okokból megéri használni, amikor erre van szükség. Ha úgy érzed, megkönnyíti a munkádat, és nem tapasztalsz teljesítménybeli problémákat, akkor szerintem használd.

Itt van pár érdekes anyag, amik további linkekkel is szolgálnak a témában.

Magyarul nem tudom, mennyire van naprakész anyag a témában, de itt egy régi Weblabor-fórumtéma.
4

Köszönöm a linkeket.

MDOC · 2014. Feb. 26. (Sze), 13.51
Köszönöm a linkeket, átnézem őket. Akkor inkább lekérdezésekbe rakom, annyira nem fontos ez a kis extra kényelem, főleg hogy ez messze nem túl bonyolult sql lekérdezés :)
5

Nem hogy gyorsabb lesz, de

kuka · 2014. Feb. 26. (Sze), 14.02
Nem hogy gyorsabb lesz, de talán még lassabb is.
<hasogatás tárgy="szőrszál">Lévén a kérdező nem árulta el milyen adatbázisról van szó, ezt nem jelenteném ki.</hasogatás>

Jó, azért sejtem, hogy MySQL. De például PostgreSQL esetében rengeteget tud dobni a nézet. Alapból már azért is, mert előfordított állapotban tárolja, a nevek helyett már eleve OID-ekkel, illetve az objektum statisztikákkal összekapcsolva. De ezen túlmenően néha nagyon lekörözte a józan paraszti logikámat. Láttam olyant, hogy adott volt ~10000 bejegyzést visszaadó lekérdezés, több táblából joinolt és nem volt benne szűrés. Ha ebbe közvetlenül beszúrtam a where feltételt úgy 4~5-ször lassabb volt mint ha a lekérdezésből nézetet csináltam és a nézetből való lekérdezéshez írtam a where feltételt. Sajnos soha nem sikerült ezt megfejteni.

Gondolom MySQL-re a fentiek nem mind igazak, de én személy szerint csak mérési eredmények alapján szoktam dönteni a nézetek hasznosságáról.
6

Így van

Hidvégi Gábor · 2014. Feb. 26. (Sze), 14.10
A PostgreSQL ebben az esetben biztosan gyorsabb a MySQL-nél.
7

Jogos, a fejemben az volt,

bamegakapa · 2014. Feb. 26. (Sze), 14.31
Jogos, a fejemben az volt, valahol írta, hogy MySQL, de most ahogy átnéztem, mégse.
8

A beillesztett SQL-ből ki

Hidvégi Gábor · 2014. Feb. 26. (Sze), 14.36
A beillesztett SQL-ből ki lehet találni.