Wie viele Zeilen in einer Datenbank sind ZU VIEL?


87

Ich habe eine MySQL InnoDB-Tabelle mit 1.000.000 Datensätzen. Ist das zu viel? Oder Datenbanken können damit und mehr umgehen? Ich frage, weil mir aufgefallen ist, dass einige Abfragen (z. B. das Abrufen der letzten Zeile aus einer Tabelle) in der Tabelle mit 1-Millon-Zeilen langsamer (Sekunden) sind als in einer mit 100.

Antworten:


114

Ich habe eine MySQL InnoDB-Tabelle mit 1000000 Registern. Ist das zu viel?

Nein, 1.000.000 Zeilen (AKA-Datensätze) sind für eine Datenbank nicht zu viel.

Ich frage, weil mir aufgefallen ist, dass einige Abfragen (z. B. das Abrufen des letzten Registers einer Tabelle) in der Tabelle mit 1 Million Registern langsamer (Sekunden) sind als in einer mit 100.

In dieser Aussage gibt es viel zu erklären. Die üblichen Verdächtigen sind:

  1. Schlecht geschriebene Anfrage
  2. Verwenden Sie keinen Primärschlüssel, vorausgesetzt, einer ist sogar in der Tabelle vorhanden
  3. Schlecht gestaltetes Datenmodell (Tabellenstruktur)
  4. Fehlende Indizes

4
5. Veraltete Serverspezifikationen <Letzter Ausweg.
Sneakyness

18
@Brimstedt: Ich dachte auch immer, das Substantiv sollte "Indizes" sein, aber ich glaube nicht, dass ich jemals jemanden gesehen habe, der es für Datenbanken verwendet: von Wikipedia: en.wikipedia.org/w/… bis Mr. Coding Horror: Codinghorror. com / blog / archives / 000638.html . Es gibt diesen interessanten SO-Beitrag zum Thema: stackoverflow.com/questions/1001366 .
Daniel Vassallo

7
6. Nicht genügend Speicher für die verschiedenen Caches von innodb
Jason

für eine bessere Leistung, ob ich PrimaryKey verwenden muss? Was ist mit anderen Schlüsseln wie Index, Unique? Darf ich diese verwenden? danke
user1844933

Vielleicht ist der Computer mit Speicher voll, wie Jason sagte, und schneidet mitten im Prozess ab
ytpillai

67

Ich habe eine Datenbank mit mehr als 97.000.000 Datensätzen ( 30 GB Datendatei ) und habe kein Problem.

Denken Sie daran , zu definieren und verbessern Sie Ihre Tabelle Index .

Es ist also offensichtlich, dass 1.000.000 nicht VIELE sind! (Aber wenn Sie nicht indizieren; ja, es ist VIELE)


10
Würde das Hinzufügen eines "Primärschlüssels" zu einer Spalte (durch Auswahl des automatischen Inkrements) eine Indizierung sein?
Nathan

8
@Nathan: Wenn Sie eine Spalte als Primärschlüssel zuweisen, wird sie automatisch indiziert. Jede Tabelle kann jedoch nur einen Primärschlüssel haben. Wenn Sie einen Index für eine Spalte hinzufügen müssen, um die Abfragen zu optimieren, verwenden Sie diesen stackoverflow.com/ a / 3002635/932473
dav

Ich habe eine Tabelle mit einer Billion, aber die Auswahl der Daten im IN LIFO-Format ist langsam.
Saurabh Chandra Patel

Definieren Sie, keine Probleme zu haben. Wie lange dauert die komplexeste Abfrage? Wir haben eine Tabelle mit 100 Millionen Zeilen und ein Client erwartet, dass Abfragen in maximal 5 Sekunden ausgeführt werden, unabhängig davon, welche Gruppierungs- oder Bestellkriterien er verwendet. Unsere Indizes könnten verbessert werden, aber bevor wir alles sperren, um einen Index hinzuzufügen
Joe Yahchouchi

20% der Produktionstabellen (laut einer alten Studie) haben mehr als 1 Million Zeilen. Ich habe einige mit mehreren Milliarden Zeilen gesehen.
Rick James

18

Verwenden Sie 'EXPLAIN', um Ihre Abfrage zu untersuchen und festzustellen, ob mit dem Abfrageplan etwas nicht stimmt.


6
Obwohl dies eine gute Idee ist, ist diese Antwort selbst nicht gut, um sie einem Neuling zu geben. Die Ausgabe von EXPLAIN ist nicht sehr intuitiv ...
Nickf

16
Es gibt kein anderes Tool, mit dem Sie die Abfragen untersuchen können. Beginnen Sie also besser mit dem Lernen EXPLAIN- Neulinge oder nicht.
Nr.

30
wäre schön wenn jemand erklären kann EXPLAIN;)
Jo E.


15

Ich denke, dies ist ein weit verbreitetes Missverständnis - Größe ist nur ein Teil der Gleichung, wenn es um die Skalierbarkeit von Datenbanken geht. Es gibt andere Probleme, die schwierig (oder schwieriger) sind:

  • Wie groß ist der Arbeitssatz (dh wie viele Daten müssen in den Speicher geladen und aktiv bearbeitet werden). Wenn Sie nur Daten einfügen und dann nichts damit anfangen, ist das Problem tatsächlich leicht zu lösen.

  • Welches Maß an Parallelität ist erforderlich? Gibt es nur einen Benutzer, der einfügt / liest, oder arbeiten viele tausend Clients gleichzeitig?

  • Welches Maß an Versprechen / Haltbarkeit und Leistungskonsistenz ist erforderlich? Müssen wir sicherstellen, dass wir jedes Engagement einhalten können? Ist es in Ordnung, wenn die durchschnittliche Transaktion schnell ist, oder möchten wir sicherstellen, dass alle Transaktionen zuverlässig schnell sind (Six Sigma-Qualitätskontrolle wie - http://www.mysqlperformanceblog.com/2010/06/07/performance-optimization- und-Sechs-Sigma / ).

  • Müssen Sie betriebliche Probleme ausführen, z. B. das Tabellenschema ändern? In InnoDB ist dies möglich, aber unglaublich langsam, da häufig eine temporäre Tabelle im Vordergrund erstellt werden muss (Blockierung aller Verbindungen).

Also werde ich sagen, dass die zwei einschränkenden Probleme sein werden:

  • Ihre eigene Fähigkeit, Abfragen zu schreiben / gute Indizes zu haben.
  • Wie viel Schmerz können Sie tolerieren, wenn Sie auf ALTER TABLE-Anweisungen warten.

2
Bearbeiten: Hinweise zum Erstellen temporärer Tabellen durch ALTER TABLE sind etwas veraltet. MySQL 5.5 verfügt über eine schnelle Indexerstellung und 5.6 über eine Online-DDL.
Morgan Tocker

3

Wenn Sie 1 Million Zeilen meinen, hängt dies davon ab, wie Ihre Indizierung durchgeführt wird und wie Ihre Hardware konfiguriert ist. Eine Million Zeilen ist keine große Menge für eine Unternehmensdatenbank oder sogar eine Entwicklungsdatenbank für anständige Geräte.

Wenn Sie 1 Million Spalten meinen (nicht sicher, ob dies in MySQL überhaupt möglich ist), dann scheint dies ein bisschen groß zu sein und wird wahrscheinlich Probleme verursachen.


3

Registrieren? Meinst du Rekord?

Eine Million Datensätze sind heutzutage keine große Sache für eine Datenbank. Wenn Sie auf ein Problem stoßen, ist es wahrscheinlich nicht das Datenbanksystem selbst, sondern die Hardware, auf der Sie es ausführen. Sie werden höchstwahrscheinlich nicht auf ein Problem mit der Datenbank stoßen, bevor Ihnen die Hardware ausgeht, um darauf zu werfen.

Offensichtlich sind einige Abfragen langsamer als andere, aber wenn zwei sehr ähnliche Abfragen zu sehr unterschiedlichen Zeiten ausgeführt werden, müssen Sie den Ausführungsplan der Datenbank herausfinden und dafür optimieren, dh korrekte Indizes, ordnungsgemäße Normalisierung usw. verwenden.

Übrigens gibt es in einer Tabelle keinen "letzten" Datensatz, logischerweise haben sie keine inhärente Reihenfolge.


Ich meine so etwas wie "SELECT * FROM table ORDER BY id DESC LIMIT 0"
Juanjo Conti

4
Vielleicht brauchen Sie SELECT LAST_INSERT_ID()statt dieser Abfrage.
True Soft

3

Ich habe nicht partitionierte Tabellen mit mehreren Milliarden (indizierten) Datensätzen gesehen, die für analytische Arbeiten selbst verbunden wurden. Wir haben das Ding schließlich aufgeteilt, aber ehrlich gesagt haben wir nicht so viel Unterschied gesehen.

Das heißt, das war in Oracle und ich habe dieses Datenvolumen in MySQL nicht getestet. Indizes sind dein Freund :)


2

Angenommen, Sie meinen "Datensätze" mit "Registern". Nein, es ist nicht zu viel. MySQL lässt sich sehr gut skalieren und kann so viele Datensätze aufnehmen, wie Sie auf Ihrer Festplatte haben.

Offensichtlich sind Suchanfragen jedoch langsamer. Daran führt kein Weg vorbei, außer sicherzustellen, dass die Felder ordnungsgemäß indiziert sind.


2
Technisch gesehen kann die Größe der Tabelle auch durch die maximale Dateigröße des von Ihnen verwendeten Dateisystems begrenzt sein.
Tster

0

Je größer die Tabelle wird (wie in mehr Zeilen), desto langsamer werden normalerweise Abfragen ausgeführt, wenn keine Indizes vorhanden sind. Sobald Sie die richtigen Indizes hinzugefügt haben, sollte sich Ihre Abfrageleistung verbessern oder zumindest nicht so stark verschlechtern, wie die Tabelle wächst. Wenn die Abfrage selbst jedoch mehr Zeilen zurückgibt, wenn die Tabelle größer wird, wird erneut eine Verschlechterung festgestellt.

Während 1M Zeilen nicht so viele sind, hängt es auch davon ab, wie viel Speicher Sie auf dem DB-Server haben. Wenn die Tabelle zu groß ist, um vom Server im Speicher zwischengespeichert zu werden, sind die Abfragen langsamer.


0

Die Verwendung der bereitgestellten Abfrage ist aufgrund der Verwendung einer Sortierzusammenführungsmethode zum Sortieren der Daten außergewöhnlich langsam.

Ich würde empfehlen, das Design zu überdenken, damit Sie Indizes verwenden, um es abzurufen, oder sicherzustellen, dass es bereits auf diese Weise bestellt wurde, sodass keine Sortierung erforderlich ist.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.