Les nouveautés de MySQL 5.1 — (part 1/5)
Que de chemin parcouru depuis ce 5 juillet 1999, date de lancement de MySQL 3.23.0. En plus des objectifs de simplicité d’administration, de hautes performances et de fiabilité, se sont greffées, au fur et à mesure, les fonctionnalités les plus demandées par les utilisateurs. La nouvelle version du SGBDR open-source le plus utilisé, sortie en GA le jeudi 27 novembre 2008, ne déroge pas à ces règles d’or. Numéro un pour les applications en ligne, MySQL se positionne maintenant sur le secteur des applications d’entrepôts de données et d’informatique décisionnelle.
Le but de cet article est de brasser un large panorama des principales nouveautés de MySQL 5.1, telles que le partitionnement, le programmateur d’évènements, la réplication par les données, ainsi que le support des données sur disque avec MySQL Cluster et le support xml/xpath.
Le partitionnement
Une des fonctionnalités phare de cette nouvelle mouture, est la possibilité de partitionner ses tables MySQL. Le partitionnement consiste à fragmenter une table en fonction des données qu’elle contient. Le but principal est d’optimiser les performances : le partitionnement peut permettre d’améliorer les réponses de certaines requêtes. Les données étant stockées dans différentes partitions, l’optimiseur ne prendra pas en compte les partitions non impactées par la requête (PRUNING).
Un autre objectif est de faciliter certaines tâches de maintenance : les données d’une partition peuvent être facilement et rapidement effacées, simplement en supprimant la partition.
Enfin, le partitionnement permet de mettre les données et les index sur des disques différents : il est possible de stocker les données et les index sur des disques séparés, pour les tables MyISAM.
Le partitionnement avec MySQL
La commande SHOW VARIABLES LIKE ‘have_partitioning’ est un moyen simple de savoir si votre version de MySQL supporte le partitionnement.
mysql> SHOW VARIABLES LIKE 'have_partitioning'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | have_partitioning | YES | +-------------------+-------+ 1 row in set (0.10 sec)
L’opération de partitionnement proprement dite se réalise lors de la création de la table (avec la commande CREATE TABLE) ou lors de la modification de sa structure (avec la commande ALTER TABLE) en utilisant la clause PARTITION BY.
CREATE TABLE ... ENGINE = <engine> PARTITION BY <type> ( <expression> )
Il est a noter que les moteurs Merge, Federated, CSV ne permettent pas le partitionnement.
<engine> = MyIsam | InnoDB | Archive | Falcon | NDBCluster | Memory
MySQL propose 4 types de partitionnement, par intervalle (RANGE), par liste (LIST), et par hachage (HASH ou KEY).
<type> = RANGE | LIST | HASH | KEY
Quelques exemples de partitionnements
Partitionner sa table est une opération très simple. Le plus délicat est finalement de savoir pourquoi partitionner et comment le faire. Le critère de partitionnement est donc essentiel pour espérer gagner en performance.
-- Partitionnement par intervalle CREATE TABLE 'City_part_range' ( 'ID' int(11) NOT NULL AUTO_INCREMENT, 'Population' int(11) NOT NULL DEFAULT '0', KEY 'ID' ('ID') ) ENGINE=MyISAM PARTITION BY RANGE (population) ( PARTITION p0 VALUES LESS THAN (100), PARTITION p1 VALUES LESS THAN (1000), PARTITION p2 VALUES LESS THAN (10000), PARTITION p3 VALUES LESS THAN (100000), PARTITION p4 VALUES LESS THAN (1000000), PARTITION p5 VALUES LESS THAN MAXVALUE ); -- Partitionnement par liste CREATE TABLE 'Country_part_list' ( 'Code' char(3) NOT NULL DEFAULT '', 'Continent' tinyint UNSIGNED DEFAULT 1, KEY ('Code') ) ENGINE=MEMORY PARTITION BY LIST(Continent) ( PARTITION pCateg1 VALUES IN (1), PARTITION pCateg2 VALUES IN (4), PARTITION pCateg3 VALUES IN (2,6), PARTITION pCateg4 VALUES IN (3,5,7) ); -- Partitionnement par hash CREATE TABLE 'City_part_hash' ( 'ID' int(11) NOT NULL AUTO_INCREMENT, 'Name' char(35) NOT NULL DEFAULT '', 'CountryCode' char(3) NOT NULL DEFAULT '', 'District' char(20) NOT NULL DEFAULT '', 'Population' int(11) NOT NULL DEFAULT '0', PRIMARY KEY ('ID') ) ENGINE=InnoDB PARTITION BY HASH (id) PARTITIONS 4; -- Partitionnement par key CREATE TABLE 'City_part_key' ( 'ID' int(11) NOT NULL AUTO_INCREMENT, 'Name' char(35) NOT NULL DEFAULT '', 'CountryCode' char(3) NOT NULL DEFAULT '', 'District' char(20) NOT NULL DEFAULT '', 'Population' int(11) NOT NULL DEFAULT '0', PRIMARY KEY ('ID') ) ENGINE=Archive PARTITION BY KEY () PARTITIONS 6; (à suivre... event scheduler & row based Replication)
Architecte Solution Cloud chez Oracle
MySQL Geek, Architecte, DBA, Consultant, Formateur, Auteur, Blogueur et Conférencier.
—–
Blog: www.dasini.net/blog/en/
Twitter: https://twitter.com/freshdaz
SlideShare: www.slideshare.net/freshdaz
Youtube: https://www.youtube.com/channel/UC12TulyJsJZHoCmby3Nm3WQ
—–
[…] Parmi les nouveautés: […]
[…] (<- précédent) […]
mysql archive et partition…
4 tables de même structure
CREATE TABLE IF NOT EXISTS `logs` (
`id` mediumint(8) unsigned zerofill NOT NULL auto_increment,
`id_2` mediumint(8) NOT NULL,
`date` date NOT NULL,
`object_type` varchar(20) NOT NULL,
`action` varchar(20…