User since
2003-08-04
2536
Artikel
ModeratorIn
Folgendes Szenario: Ich habe eine Tabelle mit ca. 20 Datenspalten. drei davon sind primärwerte, die von entscheidender Bedeutung sind (ein enum, zwei ints), alle weiteren sind sekundäre Werte, die quasi nur in Kombination mit den ersten dreien relevant sind. Nun ändern sich die sekundären Werte aber relativ häufig und werden durch mehrere Scripts von Zeit zu Zeit upgedated. Dazu lege ich dann noch für die sekundären Werte (die sich leider nicht zusammenfassen lassen) jeweils eine Spalte dazu, die das Datum der letzten Ermittlung speichert, sodass ich quasi immer den als nächstes überarbeite, der am längsten nicht upgedated wurde. Das muss bei den sekundärwerten aber unabhängig voneinander geschehen, da manche Werte sich häufig ändern, andere wiederum selten, daher hatte ich dann vor, die häufigen eben öfter zu bearbeiten etc pp.
Szenario bisher: 17 Datenfelder, 17 Felder, wann das Datenfeld zuletzt bearbeitet wurde.
soweit, so gut. Nun will ich jedes der Datenfelder als Suchmöglichkeit nutzen, also leg ich mir darauf 17 Indizes an. Auf die Datumsfelder lege ich auch Indizes, damit die Sortierung gleich gegeben ist und beim Auslesen derer, die am längsten nicht upgedatet wurden, alles schnell geht.
Wären wir bei 34 Indizes (plus primary key..). Nun sind aber auch Suchen vorgesehen (und werden häufig durchgeführt), wo nach einem Primärwert und einer Kombination aus einem oder zwei Sekundärwerten gesucht wird. Da es einige Datensätze sind, reicht mir die Geschwindigkeit nicht, die ich so erreiche. Also lege ich wieder je einen Index, zumindest für Primärfeld1,Datenfeld1 - Primärfeld3,Datenfeld17 an. Das macht natürlich allein schon 51 Indizes. Wenn ich Primärfeld1,Datenfeld1,Datenfeld2 nehmen würde, natürlich entsprechend mehr.
Mysql erlaubt in der Standard-Config maximal 65 Indizes pro Tabelle. Das hat mich stutzig gemacht, ob ich hier vielleicht einen schrecklichen Denkfehler mache - bin ja alles andere als Datenbankspezialist. Ich mein, ich habe das so verstanden, dass, wenn ich häufig eine Abfrage mit zwei Bedingungen durchführe und die Ergebnisse schnell haben will, ich dafür einen Index über diese beiden Felder anlege - ist das soweit korrekt? Kann es dann sein, dass ich in einer Tabelle 100 Indizes habe? Oder schreit allein die Zahl automatisch Wahnsinn?
Wenn ich nun bspw. die Datumsfelder (also wann welcher Wert upgedated wurde) in eine andere Tabelle auslager, würde das ja schon mal helfen - allerdings würde eine Abfrage "gib mir die letzten 100 für sekundärwert A, die Primärwert B = C haben" lange dauern, da erst in der Datentabelle der index benutzt werden würde und dann beim join kein index für das Datumsfeld mehr laufen könnte, da ja nur ein Subset aller Datensätze aus der Datentabelle gewünscht ist.
phpMyAdmin spuckte mir gleich Warnmeldungen ins Gesicht, als ich so anfing und meinte, ich hätte mehrere Indizes auf dem selben Feld und sollte zum Psychiater. kA, ob sie das da extra so gebaut haben oder ob phpMyAdmin nur nicht gesehen hat, dass mehrere Indizes zwar das selbe Feld beinhalten aber noch mit anderen, unterschiedlichen, Feldern kombiniert sind.
Lange Rede, kurzer Sinn: lieg ich hier vollkommen Falsch oder ist das ein legitimes vorgehen und ich stoße einfach nur an die Grenzen von mysql?\n\n
<!--EDIT|jan|1150846101-->
User since
2003-08-04
7321
Artikel
ModeratorIn
[quote=jan,21.06.2006, 01:26]Kann es dann sein, dass ich in einer Tabelle 100 Indizes habe? Oder schreit allein die Zahl automatisch Wahnsinn?[/quote]
ja, genau das schreit es.
bei sovielen indizies rede ich immer von "kaputt indizieren".
eine idee wäre, die tabelle anders aufzubauen
- primary key (enum + ints)
- fieldName (index)
- fieldValue
- lastChanged (index)
dadurch würdest du zwar einen Datensatz der alten Tabelle auf 17 Datensätze in der neuen Tabelle gemapped, könnte aber schneller sein.
User since
2003-08-04
2536
Artikel
ModeratorIn
das problem ist, dass meine "primären werte" nicht zum primary key taugen, weil sie zwar relevant sind, aber nicht unique.
bräuchte ich in dem fall dann nicht jede menge queries, wenn ich ein resultat anzeigen will?
quasi eine query, um die passenden werte zu finden (wohlmöglich auch noch mit pseudojoin der selben tabelle, wenn ich nach zwei werten zugleich suche) und dann eine weitere für jedes resultat um mir alle werte zusammenzusuchen, die ich anzeigen will?
User since
2003-08-04
7321
Artikel
ModeratorIn
tust du die "spalten" immer zusammen updaten oder einzelnen?
oder wie?
wenn ich ehrlich bin, kann ich mir die sache nicht zur gänze vorstellen.
User since
2003-08-04
2536
Artikel
ModeratorIn
die spalten werden immer wieder einzeln upgedated, also quasi mit einem einfachen
update meinetolleTabelle SET datenfeld = 'bla' WHERE id = 4;
User since
2003-08-04
7321
Artikel
ModeratorIn
[quote=jan,21.06.2006, 02:27]update meinetolleTabelle SET datenfeld = 'bla' WHERE id = 4;[/quote]
das ist doch toll
würde dann zumindest bei meinem ansatz so aussehen
update meinetolleTabelle SET fieldValue = 'bla' WHERE id = 4 AND fieldName = 'datenfeld';
"ein" datensatz besteht dann in wirklichkeit aus mehreren datensätzen; abfrage dann
select (fieldName, fieldValue) FROM meinetolleTabelle WHERE id = 4;
und so weiter...
und da auf id und fieldName ein Index liegt, sollte das doch eigentlich ganz flott gehen\n\n
<!--EDIT|esskar|1150850032-->
User since
2003-08-04
2536
Artikel
ModeratorIn
mh, ich werd das morgen mal austesten. danke soweit.
User since
2004-06-17
305
Artikel
BenutzerIn
HI, nur mal so nebenbei gefragt da hier "nur" von einer Tabelle die Rede ist - ohne den Inhalt dieser zu kennen:
Bist Du Dir sicher, dass Deine DB nach den Normalisierungsregeln (mind. bis zur 3.) aufgebaut ist?