SQL Datenbank Speicherplatz sparen?

Moin SeeKing,

alles richtig, was Du schreibst - Speichergrenzen und Datenvolumen sind handlebar... und mit ein bisschen Feintuning macht die DB dann trotzdem noch Spaß. Bzw. lässt sich auch für "produktiven Einsatz" vorzeigen.

Aber, wie auch dbwizard durch seine Nachfragen ans Tageslicht gebracht hat - das ist eben keine Datenbank, die nun mal dazu gezwungen ist, mit ein paar TeraByte klarkommen zu müssen.

Sondern eine teilweise Drauflos-Zusammengeklickte Applikation, die Daten in einer Form sammelt, wie andere Anwendungen bestenfalls Debug-Logfiles mit gesetztem Schalter /TraceWhateverMoves wegschreiben.

Da muss erstmal ein wenig an den Grundlagen und am Design nachgearbeitet werden - und nach der Sommerpause können wir dann ein bisschen tunen und einzelne Statements flotter machen.

@deintag85
Das ist jetzt nicht abwertend gemeint - niemand von uns ist im ersten Anlauf an allen Stolpersteinen vorbeigelaufen.
Aber für Dich und Deine Appz nützen jetzt kleine partielle Tipps nicht viel.
Stell die (konkrete) Entwicklung für ein paar Tage zurück und quäle Dich durch ein Tutorial/einen Kurs/ein Buch zm Thema.

Selbst mit einer "problemlösenden Antwort" zu Deiner eigentlichen Frage bekommst Du sonst nur eine Scheinlösung.

Grüße
Biber
 
Moin Biber,

deswegen auch meine letzten 3 Zeilen. Ich wollte nur das Argument entkräften, dass MySQL mit solchen Mengen nicht zurecht kommen würde. Manche glauben das leider wirklich noch :)

Allerdings so ab 5 TB sollte man doch mal langsam Richtung Oracle, DB2 etc. denken...

Als Einstieg (zwar steinig und sehr steile Lernkurve aber RICHTIG gut) kann ich dir das Buch "High Performance MySQL" vom O´Reilly Verlag empfehlen. Allerdings setzen die schon einiges voraus. Es wird zwar kurz erklärt du wirst aber nicht drumherumkommen einiges in der MySQL Doku nachzuschlagen. Aber in den Kapiteln 2 - 7 werden genau deine Fragen und Probleme behandelt. (Modeldesign, Variablenspaces, Partions, Growing Tablespaces etc.)

Wenn du soweit bist kannst du gerne auch nochmal ein Datenbankmodel posten. Ich bin sicher einige werden es liebend gerne für dich "zerpflücken". Nicht umsonst bilden wir Datenbankdesigner 3 Jahre lang aus :D

Man kann Datenbank nicht von heute auf morgen lernen. Access kann jeder zusammenklicken aber richtig große DB´s (die auch noch schnell sein müssen) das ist eine Wissenschaft für sich. UND GANZ WICHTIG immer im Kopf behalten. Eine Datenbank basiert immer auf der Mengenlehre! Du hast immer deine "Tabellenmengen" (mit Absicht in Klammern da gibts einen anderen Begriff). Wenn du schonmal von dieser Ansicht an die Sache rangehst kannst du schonmal nicht mehr zu 100% falsch gehen. ;)

Gruss
SeeKing

@Biber u. dbwizard
Ich denke gerade darüber nach einen Datenbankmodellierungs "Workshop" mal zu schreiben. Nur allein wird das wohl etwas heftig. Weil solche Threads sind mir jetzt schon ein paar Mal (nicht nur hier) aufgefallen. Wärt ihr dabei?
 
Zuletzt bearbeitet:
Hallo..

CREATE INDEX ip_idx ON mytable (IP);

CREATE INDEX Datumsfeld_idx ON mytable (Datumsfeld);

gruss

Hallo,
ich hab diverse Befehle ausprobiert in PHPMYADMIN aber keines hat irgendwie funktioniert. Dauernd bekam ich eine Fehlermeldung dass der Befehl falsch sei.

Dann bin ich darauf gestossen dass man mit einem Klick einen Index erstellen kann. Das hab ich für beide Spalten gemacht. "ALTER TABLE xxx ADD INDEX(IP)" wurde dann ausgeführt ebenso wie für das Datum. Das heisst ja in meiner Abfrage muss ich nichts ändern, oder?... Weil von der Geschwindigkeit hat sich nichts getan :-/

-----
Man findet überall neue Infos....Jetzt les ich dass man CREATE INDEX nur machen kann wenn man grad eine neue Tabelle erstellt hat? Alternativ MUSS man ALTER TABLE machen....hmmmm, aber ist dann der tabellenname der gleiche?

---- edit 2

Ich glaub ich habs gebacken gekriegt. Also man erstellt ein INDEX direkt nach der Tabelle oder macht ALTER TABLE tabellenname ADD INDEX index_name (SPALTENNAME)....
Wow, von 50 Sekunden auf 6 Sekunden runtergeschraubt und das bei 50.000 Einträgen. Unfassbar...Gut ich probier erstmal meinen Code zu optimieren, vllt hol ich noch was raus...

^^

---edit 3

Ich bin total verwirrt? Ich finde einfach nichts Sinnvolles. Wie soll ein Laie da überhaupt etwas erfahren? OK. Ich erstelle einen INDEX auf eine Spalte und dann? Muss ich dann die Spalte abfragen oder den INDEX_NAMEN? Ich finde einfach keine Antwort und suche wie ein verrückter seit mehrerereren Stunden. !!

--- edit 4

Selbstgespräche machen Spass =)

Hab was gefunden

Code:
	$abfrage = "SELECT COUNT(DISTINCT IP) as Besucher FROM `".$counter."` USE KEY (idx_datum) WHERE DATE(Datum) = '".$sqldatum."'";

Also mit USE KEY (index_name) greift man wohl auf den index zu. scheeeeeint theoretisch zu klappen. also ich sehe eine 10fache verschnellerung beim ersten blick, von 50 auf 5 sekunden...jetzt müsst ich nochmal die unnötig doppelten abfragen optimieren und könnt es eventuell halbieren....


--edit 5

ich kann nicht mehr :-! ich hab im falschen ordner programmiert als da wo ich mir das ergebnis angeschaut habe. ich hab nie was verändert Oô ich versteh die welt nicht mehr.
und ich hab mich zu früh gefreut. ich habe null ahnung warum es auf einmal so schnell ging. jedenfalls ist es wieder sehr langsam :/
 
Zuletzt bearbeitet:
Hallo,
ich hab diverse Befehle ausprobiert in PHPMYADMIN aber keines hat irgendwie funktioniert. Dauernd bekam ich eine Fehlermeldung dass der Befehl falsch sei.

Dann bin ich darauf gestossen dass man mit einem Klick einen Index erstellen kann. Das hab ich für beide Spalten gemacht. "ALTER TABLE xxx ADD INDEX(IP)" wurde dann ausgeführt ebenso wie für das Datum. Das heisst ja in meiner Abfrage muss ich nichts ändern, oder?... Weil von der Geschwindigkeit hat sich nichts getan :-/

-----
Man findet überall neue Infos....Jetzt les ich dass man CREATE INDEX nur machen kann wenn man grad eine neue Tabelle erstellt hat? Alternativ MUSS man ALTER TABLE machen....hmmmm, aber ist dann der tabellenname der gleiche?
Also um mal ein wenig Licht in diesem Dschungel zu bekommen.

Du kannst Indexe auf mehrere Arten erstellen:
Code:
ALTER TABLE vorhandene_table ADD INDEX 'ie_vorhandene_table_IP' (IP);
Mit diesem Kommando fügst du der existierenden Tabelle "vorhandene_table" den Index ie_vorhandene_table_IP hinzu (Namenskonvention: Inverted Entry auf Tabelle "vorhandene_table" verknüpftes Feld(er) "IP")

statt "ADD" kannst du auch "DROP" oder "MODIFY" schreiben. Hierzu empfehle ich dir die Dokumentation unter folgendem Link:
http://dev.mysql.com/doc/refman/5.1/de/alter-table.html

Eine zweite Möglichkeit einer vorhandenen Tabelle Indexe hinzuzufügen (nicht zu modifizieren) ist diese:
Code:
CREATE INDEX 'ie_vorhandene_table_IP' (IP) ON 'vorhandene_table';
Dieses Kommando tut exakt das selbe wie auch das obere. Natürlich gibts für beide Möglichkeiten noch etliche optionale Parameter die ein Finetuning ermöglichen.

Die Doku zu diesem Befehl findest du unter folgendem Link:
http://dev.mysql.com/doc/refman/5.1/de/create-index.html

Abfragen (Selektieren) tust du immer die Tabellenspalte niemals den Index. Es gibt zwar bei einigen exotischen Anwendungsfällen die Möglichkeit direkt auf die Indexes zurückzugreifen aber das wirst du bei der Datenbankgröße NIE! brauchen. Das sind noch Spielerreien.

Code:
SELECT vt.`IP` AS IP_Adresse
FROM vorhandene_table vt
WHERE vt.`IP` = '127.0.0.1';
Dieses SQL selektiert jetzt alle "localhost" Einträge aus deiner DB und benutzt automatisch den erstellten Index. Du kannst dies überprüfen in dem du einfach mal vor das "SELECT" noch "EXPLAIN" schreibst. Also so:

Code:
EXPLAIN SELECT vt.`IP` AS IP_Adresse
FROM vorhandene_table vt
WHERE vt.`IP` = '127.0.0.1';
Dann zeigt er dir an wie er was benutzt. Hab gerade nen Notfall bekommen schreib nachher weiter.

Gruss
SeeKing
 
Zurück