MySql - WAMP - Großer Tisch ist sehr langsam (20 Millionen Reihen)

8

Also habe ich dies gepostet! gestern und bekam eine perfekte Antwort, die diesen Code zuerst ausführen musste: ALTER TABLE mytable AUTO_INCREMENT = 10000001;

Ich habe es mehrmals ausgeführt, aber WAMP nach ein paar Stunden neu gestartet, es funktioniert nicht. Nach der Ausführung über Nacht (12 Stunden) war der Code immer noch nicht ausgeführt worden.

Ich frage mich, ob meine Datenbanktabellengröße die Grenzen von mysql oder meinem Computer oder beides überschreitet.

Ich habe jedoch den hinterhältigen Verdacht, dass eine korrekte Indexierung oder ein anderer Faktor meine Leistung stark beeinträchtigen könnte. Ich weiß, 20 Millionen sind eine Menge Zeilen, aber ist es zu viel?

Ich weiß nicht viel über Indizes, außer dass sie wichtig sind. Ich habe versucht, sie zu den Feldern name und state hinzuzufügen, was ich erfolgreich gemacht habe.

Übrigens versuche ich ein eindeutiges ID-Feld hinzuzufügen, worum es in meinem Beitrag gestern ging.

Die Frage ist also: Sind 20 Millionen Zeilen außerhalb des Rahmens von MySql? Wenn nicht, fehlt mir ein Index oder eine andere Einstellung, die helfen würde, mit diesen 20 Millionen Zeilen besser zu arbeiten? Kann ich Indizes auf alle Spalten setzen und super schnell machen?

Wie immer, vielen Dank im Voraus ...

Hier sind die Spezifikationen:

Mein PC ist XP und läuft mit WAMPSERVER, Win32 NTFS, Intel Duo Core, T9300 @ 2.50GHz, 1.17 GHz, 1.98 GB oder RAM

DB: 1 Tabelle, 20 Millionen Zeilen Die Größe der Tabellen ist: Daten 4.4 Gigs, Indizes 1.3 Gigs, insgesamt 5.8 Gigs

Die Indizes werden in den Feldern 'BUSINESS NAME' und 'STATE' eingerichtet

Die Tabellenfelder sind wie folgt:

%Vor%     
Kevin 10.09.2011, 00:04
quelle

3 Antworten

8

Einige Antworten:

  • 20 Millionen Zeilen liegen gut innerhalb der Möglichkeiten von MySQL. Ich arbeite an einer Datenbank mit über 500 Millionen Zeilen in einer ihrer Tabellen. Es kann Stunden dauern, eine Tabelle neu zu strukturieren, aber normale Abfragen sind kein Problem, solange sie von einem Index unterstützt werden.

  • Ihr Laptop ist ziemlich veraltet und zu leistungsschwach, um ihn als Datenbankserver zu benutzen. Es wird eine lange Zeit dauern, einen Tisch umstrukturieren zu lassen. Die geringe Speicherkapazität und die normalerweise langsame Laptop-Festplatte behindern Sie wahrscheinlich. Wahrscheinlich verwenden Sie auch Standardeinstellungen für MySQL, die auf sehr alten Computern funktionieren sollen.

  • Ich würde nicht empfehlen, den TEXT -Datentyp für jede -Spalte zu verwenden. Es gibt keinen Grund, warum Sie TEXT für die meisten dieser Spalten benötigen.

  • Erstellen Sie keinen Index für jede Spalte, insbesondere wenn Sie darauf bestehen, die Datentypen TEXT zu verwenden. Sie können nicht einmal eine TEXT -Spalte indexieren, wenn Sie nicht einen Präfixindex definieren. Wählen Sie im Allgemeinen Indizes zur Unterstützung bestimmter Abfragen.

Sie haben wahrscheinlich viele andere Fragen, die auf dem oben genannten basieren, aber es gibt zu viel, um in einem einzelnen StackOverflow-Beitrag zu behandeln. Wenn du mit Datenbanken arbeiten willst, solltest du vielleicht ein Training machen oder ein Buch lesen.
Ich empfehle High Performance MySQL, 2. Ausgabe .

Sehen Sie sich Ihre weiteren Fragen an:

Für das Tuning von MySQL ist hier ein guter Startpunkt: Ссылка

Viele ALTER TABLE-Operationen führen zu einer Neustrukturierung der Tabelle, was bedeutet, dass die Tabelle grundsätzlich gesperrt wird, eine Kopie der gesamten Tabelle mit den angewendeten Änderungen erstellt wird und dann die neuen und alten Tabellen umbenannt und die alte Tabelle gelöscht wird. Wenn der Tisch sehr groß ist, kann dies lange dauern.

Ein TEXT-Datentyp kann bis zu 64 KB speichern, was für eine Telefonnummer oder einen Status übertrieben ist. Ich würde CHAR (10) für eine typische US-Telefonnummer verwenden. Ich würde CHAR (2) für einen US-Bundesstaat verwenden. Verwenden Sie im Allgemeinen den kompaktesten und sparsamsten Datentyp, der die Datenmenge unterstützt, die Sie in einer bestimmten Spalte benötigen.

    
Bill Karwin 10.09.2011, 00:27
quelle
2

Es wird eine lange Zeit dauern, denn Sie haben nur 2 GB RAM und 6 GB Daten / Indizes und es wird eine Menge Austausch zwischen RAM und Festplatte erzwingen. Du kannst aber nicht viel dagegen tun.

Sie könnten versuchen, dies in Stapeln auszuführen.

Erstellen Sie eine separate leere Tabelle mit der darin enthaltenen Spalte auto_increment. Fügen Sie dann Ihre Datensätze jeweils um einen bestimmten Betrag ein (z. B. 1 Status nach dem anderen). Das könnte helfen, schneller zu gehen, da Sie in der Lage sein sollten, diese kleineren Datensätze vollständig im Speicher zu verwalten, anstatt auf die Festplatte zu paging.

Sie werden wahrscheinlich viel bessere Antworten dafür bekommen, wenn es auch auf dba.stackexchange.com ist.

    
Derek Kromm 10.09.2011 00:11
quelle
0

Ich glaube, die Hardware ist in Ordnung, aber Sie müssen Ihre Ressourcen viel besser schonen.

Db-Strukturoptimierung!

  • Verwenden Sie nicht TEXT !
  • Für Telefonnummern benutzen Sie bigint unsigned . Alle Zeichen oder Alphas müssen geparst und konvertiert werden.
  • Für jede andere alphanumerische Spalte verwenden Sie zB varchar([32-256]) .
  • Die Postleitzahl ist natürlich mediumint unsigned .
  • Geschlecht sollte enum('Male','Female') sein
  • Der Umsatz könnte ein int unsigned sein
  • Status sollte enum('Alaska',...) sein
  • Land sollte enum('Albania',...) sein

Wenn Sie einen großen Index erstellen, besteht der schnellste Weg darin, eine neue Tabelle zu erstellen und INSERT INTO ... SELECT FROM ... statt ALTER TABLE ... zu verwenden.

Wenn Sie die Felder State und Country in enum ändern, wird die Indexgröße drastisch reduziert.

    
Gustav 10.09.2011 20:10
quelle

Tags und Links