[MySQL] Indizes - wie und wo

Hallo ihr hilfsbereiten MySQL-Benutzer auf tutorials.de,

Ich bin ein ziemlicher MySQL-Anfänger und schreibe gerade an einem E-Card-Script in PHP für eine Bekannte.


Der Kartendurchsatz liegt bei ca. 3000-15000 Karten pro Tag die 60 Tage lang gespeichert werden - jeweils mit einer (eindeutigen) ID.

Da ich hier aber auch sehr viele Schreib-Zugriffe habe (jede Karte wird einmal versendet und höchstens ein paar mal angeguckt) frage ich mich, ob sich ein Index überhaupt lohnt - wenn ja, dann die ID als "Unique" oder?


Eine weitere Tabelle enthält nur das Sendedatum und die ID für Karten, die zu einem bestimmten Datum zeitversetzt versandt werden sollen.

Hier wird also beinahe nur geschrieben und nur einmal pro Tag, mitten in der Nacht, per cronjob gelesen. Wie sieht es hier mit einem Index aus? Wenn überhaupt dann Sendedatum, danach werden die Datensätze ausgewählt, die einzelnen Werte kommen aber jeweils öfter vor.


Wie sieht es aus mit dem Sperren von Tabellen?
Bringt das was und wenn ja, wie und wo muss ich das machen?

Ich habe zwar einen eigenen root-Server aber auf die Performance muss (und will) ich dennoch achten, wenn also jemand sonst noch irgendwelche Tips für mich hat - immer her damit !

Schonmal vielen Dank für alle Antworten,
TheBrain
 
Guten Abend,

Du solltest auf jeden Fall mal in jeder Tabelle ein id-Feld haben (auto_increment), dieses ist dann der PRIMARY-Key. Die Leute, die eine einzelne Karte anschauen wollen, die haben ja dann höchstwahrscheinlich diese Id, es geht also superfix, diesen Datensatz zu finden. Für diese Funktionalität braucht's tatsächlich keinen weiteren Index.

Eine andere Sache wäre es, wenn auch häufig nach anderen Kriterien gesucht werden soll, wie z.B. "Zeige mir alle Karten die ein bestimmter Mensch verschickt oder bekommen hat". Dann wäre ein Index über den Absender bzw. Empfänger evtl. hilfreich (Performance besser, aber mehr Speicherbedarf).

Oder wenn Du sehr viele Karten-Vorlagen zur Auswahl hast und die User sollen nach bestimmten Kriterien suchen können (Geburtstag, Weihhnachten, Mr.-Universum-Gewinner, etc.), dann wäre das wohl auch einen Index wert.

Ein Sperren der Versanddatums-Tabelle während des Cronjobs wäre überlegenswert, dann kann in der Zeit in der der Versand-Job läuft niemand neue Karten anlegen. Ist aber auch nicht unbedingt nötig. Der Cronjob wird wahrscheinlich zunächst einen SELECT über alle heute zu versendenden Karten ausführen. Alle zum Zeitpunkt des SELECT gefundenen Karten werden abgearbeitet, wenn während der Abarbeitung noch weitere Datensätze dazukommen, werden diese einfach nicht beachtet und kommen erst beim nächsten mal dran...

Grüße,
Martin
 
Ok, so weit so gut, da habe ich mich wohl an manchen Stellen ein wenig schlecht ausgedrückt:

Die ID in der Tabelle mit den Karten darf NICHT eine fortlaufende Nummer sein, sonst könnte ich ja durch Angabe einer anderen Nummer eine Karte lesen, die garnicht für mich ist! Diese ID wird mit uniqid("") erstellt, sollte also trotzdem eindeutig sein - brauche ich dann auch keinen Index?

Und nach irgendwelchen andren Kriterien wird höchstens ab und zu sortiert, um eine Statistik zu erstellen - dann werden aber alle Einträge der Reihe nach gelesen, suchen muss ich also immer nur nach der ID

In die Cronjob-Tabelle können zur Laufzeit des cronjobs (z.B. 0:10 im Moment) sowieso keine "interessanten" Datensätze abgelegt werden, weil der cronjob ja nur Karten versendet, die zeitversetzt und heute dran sind - also spätestens gestern aufgegeben wurden, sonst wären sie nicht zeitversetzt.
Sollte ich die Tabelle dennoch sperren?

soweit schonmal ein dickes Dankeschön für eine schnelle Antwort,
TheBrain
 
Sorry für die späte Antwort - Feiertag, Brückentag, nicht im Büro gewesen.
Die ID in der Tabelle mit den Karten darf NICHT eine fortlaufende Nummer sein, sonst könnte ich ja durch Angabe einer anderen Nummer eine Karte lesen, die garnicht für mich ist! Diese ID wird mit uniqid("") erstellt, sollte also trotzdem eindeutig sein - brauche ich dann auch keinen Index?
Dann wird eben diese ID zu einem UNIQUE INDEX oder - wenn Du ohne auto_increment_ID arbeitest sogar zum PRIMARY KEY. Kein anderer Index nötig.
In die Cronjob-Tabelle [...].
Sollte ich die Tabelle dennoch sperren?
Nö. Sehe keinen Grund.

Wünsche noch gutens Gelingen,
Martin
 
Ich werde alles so machen wie ich es mir von Anfang an gedacht habe und wie es mir von dir bestätigt wurde - Danke!

Sorry für die späte Antwort - Feiertag, Brückentag, nicht im Büro gewesen.
Also ich bitte dich - bei dem Monatslohn den du von mir beziehst musst du mindestens 25 Stunden pro Tag für mich da sein ! ;)

Wünsche noch gutens Gelingen
Danke! Mit dem PHP-Code komme ich ganz gut voran (bin fast fertig :) )

Nochmal vielen Dank für deine Hilfe und Grüße,
TheBrain
 
Zurück