2012-08-30 3 views
1

Je cours MySQL 5.1 et stocke des données des notations de Web dans une table. Il y a une colonne datetime que je veux partitionner par jour. Chaque nuit j'ajoute de nouvelles données de la journée précédente dans la table, c'est pourquoi je veux partitionner le jour. Il s'agit généralement de quelques millions de lignes. Je souhaite effectuer une partition par jour, car une requête MySQL prend généralement 20 secondes. En bref, je souhaite effectuer une partition chaque jour car les utilisateurs peuvent cliquer sur un calendrier pour obtenir des informations de journal Web constituées d'une valeur de données d'un jour. Les données couvrent des millions de lignes (pour un seul jour). Le problème que j'ai vu avec beaucoup d'articles de partitionnement est que vous devez spécifier explicitement pour quelles valeurs vous voulez partitionner? Je n'aime pas ça parce que ça veut dire que je vais devoir changer la table tous les soirs pour ajouter une partition supplémentaire. Est-ce qu'il y a une fonctionnalité MySQL intégrée pour faire ça automatiquement, ou est-ce que je vais devoir écrire un script bash/cron pour modifier la table pour moi tous les soirs?Comment partitionner une table MySQL par jour?

Par exemple, si je devais suivre l'exemple suivant: http://datacharmer.blogspot.com/2008/12/partition-helper-improving-usability.html

En un an, j'aurais 365 partitions.

+0

Avez-vous des index? – Bugs

+0

@Bugs, Pas encore, mais j'allais indexer sur la colonne datetime. Quelle amélioration puis-je espérer en tirer? J'ai encore besoin de partition en plus de cela, cependant, non? – egidra

+0

Vous pouvez vous attendre à beaucoup d'amélioration avec les bons index. Une fois, je suis passé de plusieurs heures à plusieurs secondes en ajoutant un seul index. – Bugs

Répondre

2

J'ai essayé cette fois. J'ai fini par créer un travail cron pour faire le partitionnement sur une base régulière (une fois par mois). Gardez à l'esprit que vous avez un maximum de 1024 partitions par table (http://dev.mysql.com/doc/refman/5.1/fr/partitioning-limitations.html).

Désolé, je ne le recommanderais probablement pas. Pour mes besoins, j'ai vu que cela a créé un ralentissement significatif dans toutes les recherches qui nécessitaient des résultats de partition croisée.

Selon votre explication mise à jour, je recommande d'abord de créer les index nécessaires. Je voudrais lire MySQL Optimization chapitre (en particulier la section sur les index), pour mieux apprendre à vous assurer que vous avez les index nécessaires. Vous pouvez également utiliser le journal slow_query pour isoler les requêtes problématiques. Une fois que vous avez réduit cela, je peux voir votre besoin de partitionner le changement à vouloir partitionner pour limiter la taille d'une partition particulière (peut-être pour l'espace de stockage ou pour la troncature rapide, etc). À ce stade, vous pouvez décider de partager sur une base mensuelle ou annuelle. Partitionner en utilisant la date comme clé de partition vous forcera évidemment à créer un index pour le champ de date. Commencez par cela et voyez comment cela se passe avant d'entreprendre les efforts supplémentaires de partitionnement planifiés.

+0

Que me conseillez-vous de faire à la place? Je n'aurai jamais à interroger entre les partitions. Faire le partitionnement de cette façon en vaut-il la peine? – egidra

+0

Je ne suis pas sûr ... J'y pensais, mais je n'avais pas une bonne solution en tête. Mon instinct serait de ne pas partitionner plus d'une fois par mois - au moins comme si vous aviez 100 ans au lieu de 2 ans avant que vous deviez comprendre ce que vous faites avec votre schéma. La seconde consiste à déterminer quels sont vos besoins exacts. Pourquoi partitionnez-vous en premier lieu? Si vous énumérez/expliquez le problème que vous essayez de résoudre avec le partitionnement, quelqu'un (s) peut avoir une bonne solution. –

+0

Salut, j'ai ajouté mes raisons à l'article original. – egidra

2

Les index sont un doit pour n'importe quelle table. Les détails de l'index (s) dérivent du SELECTs que vous avez; Voyons les voir.

Règles générales:

  • Ne pas partitionner une table inférieure à un million de lignes
  • Ne pas utiliser plus d'environ 50 partitions.
  • Si vous «purgez les anciennes données» après un certain nombre de jours/semaines/mois, consultez le code my blog pour savoir comment procéder.
  • PARTITION BY RANGE() est le seul mécanisme de partition utile.
Questions connexes