[gull] MySQL table partitions
Daniel Cordey
dc at mjt.ch
Fri Nov 24 09:18:08 CET 2006
On Thursday 23 November 2006 23:19, Marc SCHAEFER wrote:
> On Thu, Nov 23, 2006 at 06:15:49PM +0100, Daniel Cordey wrote:
> > Je suis en train d'etudier la possibilite, avec MySQL 5.1, de creer des
> > tables avec des partitions et des sous-partitions.
>
> Peux-tu préciser de quoi il s'agit ? A quoi ça sert, qu'est-ce que cela
> fait, etc ?
La notion de partition permet d'assurer le "decoupage" d'une table. Chaque
partition est materialisee par un "fichier" (en fait trois). Ceci permet de
repartir ces partitions sur differents disques physiques. Le partitionnement
est determine lors de la creation de la table en definissant la regle de
pertionnement. Ces reges concernent des valeurs d'une, ou plusieurs, colonne.
Si, par exemple, on a une colonne 'year', on peut dire (shematiquement) :
partition 1 <==> 1995 < year < 1997
...
Les regles de partitionnement peuvent etre definie par n'importe quelle
operation SQL. CAD que l'on peut effectuer des operation de calcul et de
comparaison de dates etc.
C'est le serveur qui, lors de la requete a la base, va calculer le numero de
partition sur la base des regles definies et des arguments de la requete.
On peut dire que les partitions appportent un avantage suplementaire et
non-negligeable aux tables MERGE de MySQL. Une table MERGE n'est pas
inteligente et balaie toute les tables, sans avoir la possibilite de
determiner quel table est pertinente pour la requete. De plus, une table
MERGE n'a pas d'index mais se repose sur celles de toutes les tables la
constituant. Ce qui fait qu'un insertion ne peut se faire au travers de la
table MERGE mais doit etre explicitement faite sur la bonne table. En fait,
une table MERGE evite de faire des jointures mais impose un certain nombre de
contrainte logistique parfois assez delicates.
A contrario, les partitions permettent de s'affranchir de toutes les
contraintes des tables MERGE. Comme il s'agit d'une seule table, les
partitions sont garanties semantiquement identiques, l'insertion se fera
automatiquement dans la bonne partition, les performances sont optimum, etc.
Les partitions permettent donc de fractionner un tres grosse table en plus
petits morceaux, en ameliorant les performnces puisque la taille des indexes
de l atable initiale se trouvera fragmentee en plus petits morceaux
(insert/update !). De plus, il est possible de repartir les partitions sur
plusieurs disques, ameliorant les performances globales de l'ensemble.
Bref, pour gerer 30 tables avec une table MERGE, j'avais ecrit un programme de
modification/creation special, ainsi qu'un module python assez complexe pour
optimiser l'acces exhaustif des tables pour les requetes. Avec les
partitions, je peut jeter mon premier programme et virer plusieurs centaines
de lignes de code de mon module... tout en etant sans doute plus performant
dans certains cas et sans les problemes de logistiques tres delicats de la
table MERGE.
... Et... pour couronner le tout... sachez qu'il est possible de faire
des 'SUB-PARTITION'. Je sens que je vais me regaler :-)
Cette fonctionalite n'est disponible qu'a partir de MySQL 5.1
Partitioning: This capability enables distributing portions of individual
tables across a filesystem, according to rules which can be set when the
table is created. In effect, different portions of a table are stored as
separate tables in different locations, but from the user point of view, the
partitioned table is still a single table. Syntactically, this implements a
number of new extensions to the CREATE TABLE, ALTER TABLE, and EXPLAIN ...
SELECT statements. As of MySQL 5.1.6, queries against partitioned tables can
take advantage of partition pruning. In some cases, this can result in query
execution that is an order of magnitude faster than the same query against a
non-partitioned version of the same table. See Chapter 16, Partitioning, for
further information on this functionality. (Author: Mikael Ronström)
http://dev.mysql.com/doc/refman/5.1/en/partitioning.html
> PostgreSQL (libre) ou Progress (propriétaire) ?
Progress... non merci... il s'agit bien de PostgreSQL.
dc
More information about the gull
mailing list