Also bisher hatte ich mir so eine Tabelle vorgestellt:
Code:
CREATE TABLE `karte` (
`x` SMALLINT UNSIGNED NOT NULL ,
`y` SMALLINT UNSIGNED NOT NULL ,
`wert` TINYINT UNSIGNED NOT NULL ,
PRIMARY KEY ( `x` , `y` )
) ENGINE = MYISAM ;
Damit der Zugriff auf ein X-Y-Paar schnell ist, wird der PRIMARY-KEY für beide Spalten x und y angelegt. Ist das so korrekt?
Oder sollte ich die Tabelle doch anders aufbauen? Wie würde der Zugriff auf die einzelnen Koordinaten am schnellsten sein?
Und ja, gespeichert würden dann nur die Felder, in denen der Wert != 0 ist.
Dabei würden nur ca. die Hälfte der Felder in der Datenbank rumliegen.
Der Nachteil an der Datebank im Gegensatz zur Datei ist aber, dass zusätzlich noch die X-Y-Koordinaten und der passende Index dazu erstellt und verwaltet werden muss.
Allerdings ist die Datenbank dadurch auch etwas flexibler, falls ich die Karte mal erweitern möchte in ihrer Dimension. Aber das wird eh nie der Fall sein.
Edit:
Habe mal eine Tabelle mit 60.000 zufälligen Werten erstellt.
X-Y-Koordinaten zwischen (0|0) und (499|499).
Wenn ich jetzt den Bereich zwischen (100|100) und (200|200) anfordere, macht es scheinbar keinen unterschied, ob ich x und y als PRIMARY-KEY definiere oder nicht. Es dauert genauso lange. (Obwohl die Tabelle nciht mehr soritert war, habe einfach mal aufsteigend nach "wert" soritert).
Ich habe folgende Queries probiert, wobei das zweite mit BETWEEN ein bisschen schneller ist.
SELECT x, y, wert FROM `karte` WHERE x >= $untergrenze_x AND x <= $obergrenze_x AND y >= $untergrenze_y AND y <= $obergrenze_y
SELECT x, y, wert FROM `karte` WHERE x BETWEEN $untergrenze_x AND $obergrenze_x AND y BETWEEN $untergrenze_y AND $obergrenze_y
Insgesamt habe ich für den kleinen Bereich 0,043 Sekunden gebraucht. (ca. 2500 Datensätze)
Aber dass das mit den PRIMARY-KEY keine Auswirkung hat verwundert mich doch...