Viele Tabellen oder Zeilen, welche ist in SQL effizienter?

7

Ich baue ein Programm, das Schlagzeilen für Unternehmen und seinen Zeitstempel aus verschiedenen Quellen speichert.

Nehmen wir an, die Nummer des Unternehmens ist 1000. Es geht wie Apple, Google, Microsoft .. etc.

So kann ich über zwei Möglichkeiten nachdenken.

  1. Eine Tabelle mit zahlreichen Zeilen (der obige Code ist nur ein Beispiel).

    %Vor%
  2. 1000 Tabellen

    %Vor%

Die meiste Zeit werde ich die Nachrichten für die bestimmte Firma finden. Sagen wir, es gibt mehr als 10000 Neuigkeiten für jedes Unternehmen. Ich wundere mich, dass wenn ich eine WHERE-Klausel in der ersten Option verwenden würde, wäre es langsamer als die zweite Option.

Welche ist effizienter und warum?

    
KimchiMan 22.01.2014, 03:34
quelle

3 Antworten

12

Relationale Datenbanken speichern viele Zeilen pro Tabelle. Es gibt eine ganze Reihe von Mechanismen, um große Tabellen zu vereinfachen, wie zum Beispiel:

  • Indizes für eine beliebige Kombination von Feldern zur Beschleunigung der Suche
  • Seiten-Caching, so dass häufig verwendete Seiten im Speicher verbleiben
  • Vertikale Partitionierung (spaltenartige Datenbanken) zur weiteren Beschleunigung von Anfragen
  • Erweiterte Algorithmen wie Hash-Joins und Gruppen-Bys (zumindest in anderen Datenbanken als MySQL)
  • Verwendung mehrerer Prozessoren und Festplatten zum Verarbeiten von Abfragen

Es gibt eine Sache, die schwieriger ist, wenn Daten in einer einzigen Tabelle abgelegt werden, und das ist Sicherheit. Und in der Tat ist dies unter bestimmten Umständen ein Hauptanliegen und erfordert im Grunde, dass die Daten in eine separate Tabelle gehen. Diese Anwendungen sind selten und weit entfernt.

Um ein Beispiel dafür zu geben, wie schlecht es sein kann, Daten in mehreren Tabellen zu speichern, stellen Sie sich vor, dass Sie in Ihrem System einen Datensatz pro Unternehmen haben und ihn in einer Tabelle speichern. Diese Aufzeichnung speichert Informationen über die Firma - etwas wie Name, Adresse, was auch immer. Call ist 100 Bytes Information.

In Ihrem Schema gibt es eine separate Tabelle für jede "Firma", also eine Zeile pro Tabelle. Dieser Datensatz befindet sich auf einer Datenseite. Eine Datenseite könnte 16 KByte groß sein, so dass Sie etwa 15,9 KBytes verschwenden, um diese Daten zu speichern. Das Speichern von 1000 solcher Datensätze belegt 16 Mbyte statt etwa 7 Seiten (112 Kbytes). Das kann ein erheblicher Leistungseinbruch sein.

Außerdem berücksichtigen Sie bei mehreren Tabellen nicht die Herausforderungen bei der Pflege aller Tabellen und der Sicherstellung der Korrektheit der Daten in den verschiedenen Tabellen. Wartungsupdates müssen auf Tausende von Tabellen angewendet werden, statt auf eine Handvoll.

    
Gordon Linoff 22.01.2014, 13:02
quelle
6

Meine Erfahrung mit vielen Tabellen, die derzeit für ein Unternehmen mit mehr als 6000 Tabellen und wachsendem Umfang arbeiten, ist die Schwierigkeit, die vielen Tabellen zu verwalten. Der Vorteil ist, dass Sie die Anzahl der Zeilen in einer Tabelle reduzieren (ich habe 30 Millionen Zeilen in anderen Unternehmen), was großartig ist - aber nur, wenn Sie eine überschaubare Lösung für all Ihre Tabellen haben.

Zum Beispiel: Die 6000+ Tische sind eigentlich Hotels mit ihren Zimmernummern-IDs (data_room # _hotelID), so dass ich gespeicherte Prozeduren, Bash- oder PHP-Skripte schreiben kann, um sie zu handhaben.

Auf der anderen Seite sind viele Zeilen einfacher, weil Sie weniger Tabellen verarbeiten müssen, aber dann müssen Sie kreativ sein, um die Daten herauszuziehen. Sie werden definitiv einen Index für Ihre SQL WHERE-Klauseln hinzufügen wollen, aber das ist offensichtlich.

Optionen, die ich in der Vergangenheit verwendet habe, um große Tabellen zu verwalten, sind:

1) Fügen Sie die Daten mit Auto-Inkrement auf eine Weise ein, die Sinn macht (wie alphabetisch) - aber da Sie sehen, dass sich Ihre Daten stark ändern, ist das keine gute Option

2) Laden von Tabellen in den Speicher - Ich weiß nicht, wo Sie dies hosten, aber ich verwende MySQL im Speicher. Ich kenne nur zwei Möglichkeiten, dies zu tun: Erstens, indem ich es auf MySQL selbst eingerichtet habe, und zweitens habe ich ein Speicherlaufwerk (verwende einen Teil des Ram des Computers) und verschiebe MySQL und seine Daten auf das gemounted Laufwerk (ich habe auch Flash-Laufwerke).

Sie werden auch berücksichtigen wollen, ob Sie Daten häufiger einfügen oder auswählen.

Also zusammenfassend:

  • Wenn Sie sich entscheiden, viele Tabellen zu erstellen, stellen Sie sicher, dass sie keine großen Datenmengen enthalten und dass Sie alle verwalten können.

  • Wenn Sie mit weniger Tabellen und mehr Zeilen arbeiten, verwenden Sie Indizes, RAM-Laufwerk, Caching, um das Abrufen der Daten aus großen Tabellen zu beschleunigen.

Das sind meine zwei Cent, ich hoffe, es hilft dir!

    
Drace 22.01.2014 04:49
quelle
0

Machen Sie einen Tisch mit allen Firmen, aber verwenden Sie Fremdschlüssel! Sie können jede Firma anhand einer Nummer identifizieren und haben eine andere Nachschlagetabelle mit jeder Nummer und der Zeichenfolge der Firma. Wie:

%Vor%

und

%Vor%

Machen Sie es explizit mit Fremdschlüsseleinschränkungen: Ссылка

Auf diese Weise sparen Sie Platz, indem Sie statt Strings immer wieder Zahlen speichern, Ihre Indizes werden kleiner und Ihre Lookups werden schneller.

    
Andrew Ehrlich 22.01.2014 03:48
quelle

Tags und Links