Mysql-Abfragenoptimierung

Ich möchte eine Datenbank(abfrage) optimieren, denn bei einem Extremfall mit mehreren Million Datensätzen konnte die Seite fast nicht mehr geladen werden.
Die Tabelle sieht wie folgt aus:
ID bigint(20) UNSIGNED
type varchar(4)
home_island int(255)
action varchar(10)
start_time int(30)
time int(255)
action_id bigint(255)
since int(30)
island int(255)

[Es handelt sich um eine Tabelle für die Truppen eines Browsergames. Für jede Truppe wird ein Datensatz erstellt.]

Nun habe ich eine Funktion, die alle Truppen anzeigen soll, die sich auf einer Insel befinden. Bisher habe ich die gefragten Datensätze ausgelesen und in einem Array die Truppen gezählt. Das ist natürlich sehr Ressourcenfreundlich. Ich habe bisher noch nie mit Funktionen in Mysql gearbeitet, weil dies schlichtweg nicht nötig war.
Nun hatte ich sowas im Sinn: (Nach der Reihe die verschiedenen Typen abfragen)

Nur weiß ich nicht was ich summieren soll, ich brauche ja keine Spalte, jeder Datensatz zählt als 1. ***

Nun zum Aufbau der Tabelle. Bisher hatte ich zwei Systeme im Einsatz:

  1. Es werden mehrere Truppen in einem Datensatz zusammengefasst, solange alle Werte gleich sind. Falls sich die Truppenzahl für verschiedene Aktionen (Angreifen, Fischen gehen, etc…) nicht für einen Datensatz ausgehen, werden die Truppen des Datensatzes auf mehrere verteilt. Das führte aber zu vielen Fehlern und war sehr kompliziert…
  2. Jede Truppe hat einen eigenen Datensatz. Braucht natürlich viel Speicher un bringt lange Abfragen.

Wenn jemand noch eine andere Idee für ein System bzw für Optimierung hätte, wäre ich sehr dankbar!

[PS: Manche Begriffe mögen jetzt vielleicht nicht verstanden werden, is halt meine “Projektsprache”. Ich erkläre gern näher.]

Zusammengefasst: Es geht darum möglichst viele Datensätze möglichst speicherplatzarm und unkompliziert abzulegen und verwenden zu können.

*** Weiters verstehe ich nicht ganz, was bei dieser Abfrage rauskommt, wird da jeder Datensatz ausgegeben mit der Summe bisher, oder kommt da die schließliche Summe raus, etwa so (also eine Zahl):

$sql = "SELECT SUM() FROM `bla`"; $summe = mysql_query($sql);

Es wird nur eine Zeile zurückgegeben.

So kannst du das z.B. abrufen:

$sql = "SELECT SUM() as summe FROM `bla`"; $summe = mysql_query($sql); $obj = mysql_fetch_object($summe); echo $obj->summe;

lG
Revo

Ich habs nun so eingebaut:

Hier steckt ein Syntax-Error drin(Wenn es mit * ersetzt wird, kommt kein Fehler):

Denke es liegt an SUM()

Mfg
Mgier

Ah … sorry. Du musst noch die Spalte angeben, die aufsummiert werden soll:

lg
Revo

Das ist es ja. Es gibt keine Spalte, die aufsummiert werden soll. Im Prinzip sollen nur die Datensätze gezählt werden. COUNT() verlangt aber auch irgendwas. Soll ich einfach die ID nehmen?

count(*) nimmt man meistens.

lG
Revo

Bei * wird aber doch wieder alles genommen…Naja, hab mal die ID genommen. Funktioniert prima, Thx a lot!
Mfg
Mgier