Beste Weg, um zu verwalten, Zeile-Ablauf in mysql

Einer Anwendung führt Folgendes aus:

  • schreibt eine Zeile in eine Tabelle mit einer eindeutigen ID
  • Lesen Sie die Tabelle und finden Sie die eindeutige ID und den Ausgang der anderen Variablen (darunter die Zeitstempel).

Die Frage ist: die Anwendung muss nur Lesen die nicht abgelaufene Zeilen, die laufen alle 2 Minuten. Es gibt ein paar alternativen, dies zu erreichen: die hat die beste Leistung?

Bedenkt, dass Lesen die abgelaufene Zeilen spielt keine Rolle, wie es gemacht wird sporadisch. Die Anzahl der nicht abgelaufen Zeilen werden immer unterhalb von ein paar tausend, aber erwarten kann, sind nur ein paar hundert.

Den cron-job (Ausführung jede minute) (oder mysql-event-Zeitplan), dies zu tun kann eine der folgenden (oder irgendeine andere Idee?) basierend auf dem timestamp:

A) fügen Sie ein BOL-variable index, die Tabelle und dann Lesen, WO nicht abgelaufen ist (basierend auf der Kapsel variabel natürlich)
B) fügen Sie ein BOL-variable-partition in der Tabelle und dann Lesen Sie nur die relevanten partition (ich bin neu zu partitionieren, so dass ich nicht sicher bin, wie diese arbeiten dürfen aus)
C) Lesen Sie die gesamte Tabelle, und löschen Sie jede Zeile, die abgelaufen ist und dann schreiben die gleiche Zeile in eine andere Tabelle
D) beim schreiben, schreiben zwei Zeilen gleichzeitig in zwei Tabellen, und löschen Sie dann die abgelaufene an einem Tisch

ODER

E) nicht verwenden Sie einen cron-job, und überprüfen Sie den Zeitstempel jeder Lesen. (aber warum würde ich scan die gesamte Tabelle? Abgelaufen Reihe sind im Grunde nutzlos für die Anwendung selbst)

Bearbeiten 1

Lassen Sie mich anders formulieren Sie die Frage:

Ziel ist es, um alle Spalten einer Zeile nur, wenn die Zeile geschrieben wurde, weniger als 2 Minuten vor.

Die Tabelle hat diese Struktur, kann aber völlig neu definiert

transactionID CHAR(8) NOT NULL, 
PRIMARY KEY(transactionID),
details VARCHAR(416),
tel INT(10),
time TIMESTAMP(),
address VARCHAR(60),
town VARCHAR(30),
flat VARCHAR (5),
supplier SMALLINT()

auch supplier ist ein Fremdschlüssel, der

Indizes sind transactionID und schließlich "status", eine zusätzliche Spalte, Datentyp TO_BE_DEFINED_but_probably_SMALLint_?()

Lösung 1: Verwendung einer indizierten Spalte zeigt den status der Zeile (abgelaufen, aktiv, verwendet)

Wird erreicht, läuft ein cron-job ändern Sie das Feld Wert 1 (aktiv) 2 (abgelaufen) und die Abfrage wäre folgende:

$transaction = //a POST or GET 

$query = mysqli_query($con,"SELECT * FROM table WHERE transaction = '$transaction' AND status = 1");

if(mysql_num_rows($query)== 0){
   echo "Transaction expired";
}
else{
// I will show all the fields in the selected row;
}

mysqli_close($con);

Lösung 2: verwenden Sie eine partition auf der Basis der Zeitstempel, die jede Zeile

Wird erreicht, läuft ein cron-job partition die Spalte alle 2 Minuten, aber dann wird die Abfrage wohl schneller:

$transaction = //a POST or GET 

$query = mysqli_query($con,"SELECT * FROM table WHERE transaction = '$transaction' AND PARTITION (active)");

if(mysql_num_rows($query)== 0){
   echo "Transaction expired";
}
else{
// I will show all the fields in the selected row;
}

mysqli_close($con);

Den cron-job würde dann ähnlich sein

$date = date("Y-m-d H:i:s");
$time = strtotime($date);
$check = $time - (2);


$query = mysqli_query($con,"PARTITION BY RANGE (timestamp_field) 
(PARTITION active VALUES LESS THAN ($check)),
((PARTITION expired VALUES MORE THAN ($check));")

Lösung 3: vergessen Sie all dies und kopieren Sie die Zeilen mit einem Zeitstempel älter als 2 Minuten an einen anderen Tisch mit einem cron-job

Einfach zu bewältigen, obwohl das Skript wäre wohl schwer auf die Seite schreiben, obwohl Sie schreiben, die Effizienz der "abgelaufen" - Tabelle ist irrelevant, ich will das "active" - Abfrage zu schnell sein.

Lösung 3B: Beim hinzufügen einer Zeile, schreiben Sie es auch auf einem anderen Tisch, so dass es nur eine LÖSCHEN-Funktion, dass der cron-job ausführen.

Lösung 4: vergessen Sie alles über Sie und WO Sie auf den Zeitstempel

$transaction = //a POST or GET 

$date = date("Y-m-d H:i:s");
$time = strtotime($date);
$check = $time - (2);

$query = mysqli_query($con,"SELECT * FROM table WHERE transaction = '$transaction' AND timestamp > $check");

if(mysql_num_rows($query)== 0){
   echo "Transaction expired";
}
else{
// I will show all the fields in the selected row;
}

mysqli_close($con);
  • Deine Problembeschreibung ist nicht ganz klar. Wenn Sie sagen BOL, meinst du, boolean oder etwas anderes? Ist Ihr Ziel, um die Geschwindigkeit zu Lesen der noch nicht abgelaufene Zeilen oder löschen der abgelaufenen Zeilen? Sie sprechen WHERE suchen und dann in der gleichen Absatz über die Zeilen löschen und dann wieder über das duplizieren von Zeilen. Bitte auch erwähnen, was ist die aktuelle Leistung und die aktuelle Tabelle der Größe (wenn verfügbar). Schließlich, wenn abgelaufen Zeilen sind sinnlos; warum willst du das überhaupt gehen durch diese übung, da Sie nur ein paar tausend (das ist irrelevant).
  • klingt für mich, als Sie gerade eine einfache Sache sehr, sehr Komplex.. Sie laufen alle 2 Minuten Aufzeichnungen.. so dass Sie Sie einfügen/aktualisieren alle 2 Minuten die Datensätze, die noch nicht abgelaufen sind Recht???? wenn nicht, sollten Sie diese aufwendige mehr!! Weil es klingt wie Sie möchten, implementieren Sie eine benutzerdefinierte MultiVersion Concurrency Control (MCC oder MVCC)
  • Ziel ist die Beschleunigung der Lektüre nicht abgelaufen Zeilen. Von BOL ich meine, eine variable zu überprüfen, ob ist abgelaufen/nicht abgelaufen, aber könnte auch ein tinyINT, wenn die Art der status der Zeilen kann auch eine Dritte. Der Grund, warum ich schrieb BOl ist, dass ich wenig Verständnis für die Leistung der Indexierung basierend auf dem Typ der variable, und ich vermutete, mit einem Wert wäre schneller. Es gibt keine aktuellen Tabelle Größe wie die app entwickelt wird. Wie pro Ihre Letzte Zeile: warum sollte ich die Abfrage über die gesamte Tabelle, abgelaufene Zeilen werden viel mehr als ein paar tausend.
  • Ich bin nur die Aktualisierung von Datensätzen ändern Ihren status. Sie sind Transaktions-Zeilen, welche, wenn Sie abgelaufen ist, Sie immer noch dienen, die Statistik/Abrechnung. Mein Verständnis von MCC ist, dass es verwendet, um verschiedene Versionen der gleichen Zeile, aber in meinem Fall ändert sich die Zeile (dauerhaft) auf einen status, wo es nicht durch die Anwendung mehr (außer back-office sporadisch lesenden Zugriff)
  • denke, wir müssen immer noch den Ausgang aus show create table [Tabellenname]... Und wenn ich Sie richtig verstehe, sind Sie "löschen" (sprich Auslaufen) record(s) wenn Sie "update status" - Spalte, um null (0) oder sowas.. Und dann haben Sie höchstwahrscheinlich einen index auf der Spalte status für die Auswahl der nicht-abgelaufene Zeilen, ohne dass ein full table scan?? wenn ja, updates auf das status-Spalte sind ziemlich "teuer", weil die Daten und der index aktualisiert werden muss..
  • Ich aktualisiert meine Frage, so dass es viel klarer, hoffe ich.
  • ja, +1 für die details, aber es wäre noch schön, wenn man teilen kann, Spaltennamen und Datentypen. denken über diese ein, was die billigste Methode für die Aktualisierung, das einfügen und auswählen. wahrscheinlich werden Sie es mit Lösung 4 in combincation mit einem index auf den timestamp dies wird wahrscheinlich die beste (billigste) Methode für MySQL zu handhaben.... weiß nicht, ob Sie auch wollen, zu bereinigen (LÖSCHEN) entfernen von sehr alten Platten, weil das defrag die Tabelle und das macht die Auswahl durchsucht langsamer auf den timestamp...
  • ich habe die Struktur der Tabelle. Es scheint, dass Sie einen täglichen cron job in der Nacht zu BEWEGEN das abgelaufene Zeilen zusammen mit einem index auf den timestamp ist die Antwort?

InformationsquelleAutor smartcity | 2013-12-23
Schreibe einen Kommentar