2009-05-24 7 views
1

Ich habe ein Modell Post, die ein Ablaufdatum hat. Ich möchte wissen, was ist die beste Möglichkeit, Skalierbarkeit in diesem Fall zu verwalten. 2 Möglichkeiten:Abgelaufene Artikel verschieben?

  1. Jedes Mal, wenn ich aus der Tabelle auswählen möchten, muss ich wo EXPIRY_DATE include> JETZT. Wenn der Tisch Post wie ein Monster wächst, bin ich in Problem. Stellen Sie sich nach 3 Jahren oder mehr vor. Indizes werden auch riesig sein.

  2. Haben Sie einen Trigger, Cron-Job oder ein Plugin (wenn es existiert), würde um die Tabelle gehen und abgelaufene Elemente in eine neue Tabelle Post_Archive verschieben. Auf diese Weise bleibe ich nur aktuelle Beiträge in meinem Haupt-Tabelle, die bedeutet, dass über 3 Jahre ich so schlecht, nicht als Option sein wird, 1.

Antwort

1

Wenn Sie Daten auf einer kontinuierlichen Basis zu archivieren (Ihre # 2) als eine gute Option ist MaatKit.

http://www.maatkit.org/

Es kann „knabbern“ weg eher auf Daten in Blöcken als Massen Ausführen von Abfragen, die viele Ressourcen (und die Vermeidung von umweltschädlichen Ihren Schlüssel-Cache) verbrauchen.

Also ja, Sie würden einen Maatkit-Job von Cron ausführen.

In der Zwischenzeit, wenn Sie # 1 zur gleichen Zeit machen möchten, könnten Sie vielleicht eine Ansicht implementieren, die die Bedingung "WHERE expiry_dat> NOW" bequem verpackt, so dass Sie nicht alles in Ihren Code aufnehmen müssen.

+1

Maatkit ist ein ausgezeichneter Zeiger dank - mk-Archivierungs ist ein ziemlich kompliziertes Dienstprogramm, aber ein Begleitartikel unter http://www.xaprb.com/blog/2006/05/02/how-to- write- efficient-archiving-and-purging-jobs-in-sql/ erklärt die "Prinzipien der Operationen" und die dahinter stehenden Ideen auf äußerst lehrreiche Art - also nochmal Danke, dass Sie mich dazu gebracht haben, es zu finden! -) –

0

Ein Cron-Job klingt gut zu mir, und es kann, indem ein einfaches Skript direkt mit dem mysql Befehl, zum Beispiel grob erfolgen:

CREATE TEMPORARY TABLE Moving 
SELECT * FROM Post WHERE expiry > NOW(); 

INSERT INTO Post_Archive 
SELECT * FROM Moving; 

DELETE FROM Post 
WHERE id IN (SELECT id FROM Moving); 

DROP TEMPORARY TABLE Moving;