2009-05-24 8 views
1

J'ai un modèle avec un expiry_date. Je veux savoir quelle est la meilleure façon de gérer l'évolutivité dans ce cas. 2 options:Déplacer les éléments expirés?

  1. Chaque fois que je veux SELECT de la table, je dois inclure où EXPIRY_DATE> MAINTENANT. Si le poteau de table se développe comme un monstre, je serai en difficulté . Imaginez après 3 ans ou plus. Les index seront énormes aussi. Avoir un déclencheur, un travail cron, ou un plugin (s'il existe) qui va autour de la table et déplacer les éléments expirés vers une nouvelle table Post_Archive. De cette façon, je maintiens que les messages actuels dans ma table principale, ce qui implique que plus de 3 ans, je ne serai pas aussi mauvais que l'option 1.

Répondre

1

Si vous avez besoin d'archiver des données sur une base continue (votre # 2) qu'une bonne option est MaatKit.

http://www.maatkit.org/

Il peut « grignotage » à l'écart des données en morceaux plutôt que d'exécuter des requêtes de masse qui consomment beaucoup de ressources (et en évitant de polluer le cache clé).

Alors oui, vous exécuteriez un travail Maatkit de cron. En attendant, si vous voulez faire n ° 1 en même temps, vous pourriez peut-être implémenter une vue qui complète commodément la condition "WHERE expiration_dat> MAINTENANT" afin que vous n'ayez pas à tout inclure sur votre code.

+1

Maatkit est un excellent pointeur, grâce - mk-archiveur est un utilitaire assez compliqué, mais un article d'accompagnement à http://www.xaprb.com/blog/2006/05/02/how-to-write-efficient-archiving-and-purging-jobs-in-sql/ explique les «principes d'opéation» et les idées derrière elle d'une manière extrêmement instructive - encore merci de m'avoir conduit à le trouver! -) –

0

Une tâche cron sonne bien pour moi, et il peut être fait par l'alimentation d'un simple script directement à la commande mysql, par exemple, à peu près:

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;