Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]3698[/thread]

Tabelle mit vielen Indizes: ... lieg ich hier grundlegend falsch?



<< >> 8 Einträge, 1 Seite
jan
 2006-06-21 03:26
#34491 #34491
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
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-->
esskar
 2006-06-21 03:41
#34492 #34492
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[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.
jan
 2006-06-21 03:57
#34493 #34493
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
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?
esskar
 2006-06-21 04:02
#34494 #34494
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
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.
jan
 2006-06-21 04:27
#34495 #34495
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
die spalten werden immer wieder einzeln upgedated, also quasi mit einem einfachen
update meinetolleTabelle SET datenfeld = 'bla' WHERE id = 4;
esskar
 2006-06-21 04:31
#34496 #34496
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
[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
Code: (dl )
update meinetolleTabelle SET fieldValue = 'bla' WHERE id = 4 AND fieldName = 'datenfeld';


"ein" datensatz besteht dann in wirklichkeit aus mehreren datensätzen; abfrage dann

Code: (dl )
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-->
jan
 2006-06-21 04:38
#34497 #34497
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
mh, ich werd das morgen mal austesten. danke soweit.
MartinR
 2006-06-21 08:51
#34498 #34498
User since
2004-06-17
305 Artikel
BenutzerIn
[default_avatar]
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?
<< >> 8 Einträge, 1 Seite



View all threads created 2006-06-21 03:26.