Frage

Ich arbeite an einem sozialen Netzwerk, wie eine Teilmenge von Facebook. Ich denke, dies bedeutet, dass die Anwendung mehr wird gelesen lastig als Schreib schwer (das heißt mehr als SELECTS Einfügungen, Aktualisierungen oder löscht)

Ich plane MySQL für die Datenbank zu verwenden, MyISAM verwenden. Jede Tabelle in der Datenbank werden die folgenden drei Felder enthalten:

  • CREATED - ein Datumsfeld die Zeit der Datensatz enthält, erstellt wurde
  • UPDATED - ein Datumsfeld enthält die Zeit der Datensatz geändert wurde
  • ROWSTATUS - a. CHAR (1) Feld einen einzelnen Zeichen-Flag enthält, um zu zeigen, wenn die Aufzeichnung aktiv ist, inaktiv oder Deleted (Wert 'A', I verwenden und D, respectively)

Durch eine PHP-Wrapper-Klasse stellen wir sicher, dass alle SELECT-Abfragen die RowStatus umfassen, und UPDATE-Abfragen aktualisieren auch die aktualisierte Spalte und INSERT-Abfragen die ERSTELLT Spalte aktualisieren.

Ich plane nicht, um tatsächlich alle Datensätze zu löschen, statt zu Update entscheiden, die RowStatus Feld D zeichnet zeigen sie gelöscht wird (das heißt ein weiches Löschen).

Wir haben eine SQL-Prozedur, die physikalisch die gelöschten Daten nach 10 Tagen gelöscht.

Aber ich ging durch dieser Artikel die argumentieren, dass es keine Notwendigkeit physisch wegen Sperren Gemeinkosten zu löschen ist. Vielmehr schlug der Autor dieses Schema verwendet:

SELECT e.eventid,e.title
    FROM events e
   WHERE NOT EXISTS
    (SELECT * FROM event_deletes ed WHERE ed.eventid = e.eventid);

Ich frage mich, wie mein Schema mit diesem vorgeschlagenen Mechanismus vergleicht, und was ist besser? Ich konnte nicht auf eine endgültige Antwort auf meinem eigenen erreichen.

War es hilfreich?

Lösung

Wie @ Pentium10 sagt, gibt es nichts an sich falsch mit Ihrem Plan. Es ist eigentlich ein ziemlich Standard-Ansatz.

Das Problem ist nur, dass, wenn Sie MyISAM Ihre UPDATEs die gesamte Tabelle, während die Abfrage ausgeführt wird, um Schloss sind verursacht. Dass führt einen Engpass, weil man nur einen einzelnen Datensatz zu einem Zeitpunkt, aktualisieren oder löschen.

Wenn Sie einen Grund für die Verwendung von MyISAM haben, würde ich Umstellung auf InnoDB als Datenbank-Engine empfehlen. InnoDB verwendet Sperren auf Zeilenebene, so dass Ihre UPDATE-Abfragen nicht anderes Updates blockieren. Es hat auch einige andere nette Features wie Unterstützung für Transaktionen und referenziellen Integrität.

Andere Tipps

Das einzige Problem, das ich hier zu sehen, die im Vergleich zu diesem Artikel, dass Sie nur Umgang mit Sperren für den DELETE-Aufruf.

Sie sollten wissen, dass UPDATE und DELETE-Anweisungen immer eine exklusive Sperre auf einer MyISAM-Tabelle erteilen muss.

Das ist, warum der Artikel empfiehlt eine INSERT statt einen UPDATE RowStatus verwenden. Sie sollten gehen, wie der Artikel sagt. Erstellen Sie eine dedizierte Tabelle die gelöschten IDs zu speichern, und verwenden Sie die auf den wählt beitreten empfohlen nicht Datensätze gelöscht abzurufen. Auf diese Weise auf Endbenutzers Löschaktion, werden Sie nur in die Tabelle einfügen, und Sie werden nicht Ursache Update-Sperre auf dem Tisch. Wenn Sie die richtigen Tasten zu beiden der Tabellen hinzufügen, wird die Verbindung nur auf den Indizes erfolgen, si es schnell sein wird, auf der SELECT.

Sie sind auch die Einführung Overhead, wenn Sie die Zeit des Updates speichern. Sie sollten diese Idee fallen, da keine Verwendung hat, und Sie werden nicht zu sagen, verwenden, um, wenn ein Datensatz aktualisiert wurde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top