Sollte ich häufig aktualisierte Spalten trennen?

7

Ich habe eine usersTabelle mit Benutzerinformationen und eine Spalte mit dem Namen credits, die häufig aktualisiert wird.

  • Auf der Indexseite wird eine Liste der Benutzer mit grundlegenden Benutzerinformationen angezeigt, ich benötige jedoch keine Credits.

  • Auf der Detailseite zeige ich auch Credits mit Benutzerinformationen.

Zwei Hauptoperationen sind im Projekt dicht. Die erste Operation ist die SELECTOperation auf der Indexseite. Die zweite Operation ist die UPDATEOperation für Credits. creditsDie Spalte ist nicht indiziert, aber da sie häufig aktualisiert wird, wirkt sie sich auf die indizierten Spalten in der usersTabelle aus? Wenn ja, sollte ich die creditsSpalte als Tabelle trennen und sie nur bei Bedarf verbinden. Kann ich auf diese Weise die SELECTLeistung auf der Indexseite verbessern ?

Außerdem verwende ich MySQL. Welche Art von Tabellenstruktur sollte ich für häufig aktualisierte Spalten verwenden?

RolandoMySQLDBA
quelle

Antworten:

11

Es scheint, dass Sie einen sogenannten Nur-Index-Scan für die Abfrage auf der Seite "Index" wünschen. Das bedeutet, dass Sie alle Daten (Spalten) haben, die Sie auf der Indexseite in dem Index auswählen, den Sie für diese Abfrage verwenden. Dies macht es unnötig, bei der Ausführung dieser Abfrage zur Tabelle zu gehen.

Beispiel:

SELECT name, basic, information
  from users
 where filter = something 

(Ich nehme nur an, Sie verwenden einen Filter).

Wenn Sie den folgenden Index erstellen:

 ALTER table users add index (filter, name, basic, information);

MySQL kann die obige Abfrage ausführen, ohne tatsächlich etwas aus der Tabelle zu lesen (nur den Index - daher nur Index-Scan). Mit anderen Worten, die Anzahl der Spalten in der Tabelle hat keinen Einfluss auf die Leistung dieser Abfrage.

Sie erkennen einen Nur-Index-Scan an der Anwesenheit von "Verwenden des Index" in der Spalte "Extra" des Ausführungsplans (Erläuterung).

Wenn Sie Spalten aktualisieren, die nicht Teil dieses Index sind, muss der Index nicht aktualisiert werden.

Einige Links zu meiner Website http://use-the-index-luke.com/

Markus Winand
quelle
0

Wenn Benutzer zu Credits eine Eins-zu-Eins-Beziehung sind, können Sie die creditsIn- usersTabelle selbst behalten . Ich glaube nicht, dass dies die Leistung der SELECTAbfrage auf der Indexseite beeinträchtigt . Sie können einfach die gewünschten Spalten abrufen. Das Normalisieren der Tabelle ist gut, aber wenn Sie für alle Spalten wie diese normalisieren, ist die Leistung viel langsamer, wenn Sie Verknüpfungen für alle diese Tabellen durchführen.


quelle
-1

Ja, du hast recht. Sie sollten die Spalte "Credits" von der Tabelle trennen, damit Details effizient funktionieren. Und versuchen Sie nicht, Indizes für häufig verwendete Tabellen zu erstellen.


quelle