Avant, quand je voyais la cloison, je la pinçais, elle était tellement haute. Hier, j'ai enfin appris ce qu'est le partitionnement, mais ce n'est rien de plus. Pour résumer aujourd'hui, une bonne mémoire n'est pas aussi bonne qu'une mauvaise écriture.
MySQL prend en charge la fonction de partitionnement à partir de la version 5.1. Une phrase pour le partitionnement est la suivante : 把一张表按照某种规则(range/list/hash/key等)分成多个区域(页/文件)保存。
Pour le développement d'applications MySQL, il n'y a aucune différence entre le partitionnement et le non-partitionnement (c'est-à-dire qu'il est transparent pour l'application). C'est comme "le briser en morceaux" dans une bataille en petits groupes. MySQL prend en charge la plupart des moteurs de stockage (tels que MyISAM, InnoDB, Memory, etc.) pour créer des partitions, mais ne prend pas en charge MERGE et CSV pour créer des partitions. Toutes les partitions de la même table de partition doivent appartenir au même moteur de stockage. Faire une citation :
#创建一个5个hash分区的myisam表 CREATE TABLE `test`.`partition_t1`( `id` INT UNSIGNED NOT NULL, `username` VARCHAR(30) NOT NULL, `email` VARCHAR(30) NOT NULL, `birth_date` DATE NOT NULL ) ENGINE=MYISAM PARTITION BY HASH(MONTH(birth_date)) PARTITIONS 5;
Peut stocker plus de données (limite maximale d'un seul fichier dans le système)
Optimiser la requête dans la clause Where, si la condition de partition est. inclus, analysez uniquement une ou une partie d'une partition pour améliorer l'efficacité des requêtes. Lorsqu'il s'agit de fonctions telles que sum(), elles peuvent être traitées en parallèle sur les partitions et les résultats sont enfin résumés.
Pour les données expirées ou inutiles, vous pouvez supprimer les partitions associées pour supprimer rapidement les données.
En dispersant les requêtes de données sur plusieurs disques, la capacité de concurrence d'une seule table est améliorée et les performances d'E/S du disque sont également améliorées.
est divisé en 4 types :
partition de plage : basée sur un étant donné La plage d'intervalles continus des données est allouée à différentes partitions.
Partitionnement de liste : similaire au partitionnement de plage, la différence est que la liste est partitionnée en fonction de la liste de valeurs énumérées et que la plage est partitionnée en fonction de la plage.
Partition de hachage : en fonction du nombre de partitions donné, allouez les données à différentes partitions (modulo/linéaire)
Partition de clé : similaire à partitionnement de hachage.
Dans le partitionnement par plage, liste et hachage dans MySQL 5.1, la clé de partition doit être un entier. MySQL 5.5 et supérieur prend en charge les partitions de plage et de liste non entières, à savoir : les colonnes de plage et les colonnes de liste.
Remarque : quel que soit le type de partitionnement, soit il n'y a pas de clé primaire/clé unique sur la table de partition, soit l'une des clés de partition doit être une clé primaire/clé unique.
Le partitionnement de plages utilise des plages de valeurs (intervalles) pour diviser les partitions. Les intervalles doivent être continus et ne peuvent pas se chevaucher. . Utilisez l'opérateur values less than
pour effectuer la définition de la partition.
Exemple 1 :
CREATE TABLE `test`.`partition_t2`( `id` INT UNSIGNED NOT NULL, `username` VARCHAR(30) NOT NULL, `email` VARCHAR(30) NOT NULL, `birth_date` DATE NOT NULL ) ENGINE=MYISAM PARTITION BY RANGE(id)( PARTITION t21 VALUES LESS THAN (10), PARTITION t22 VALUES LESS THAN (20), PARTITION t23 VALUES LESS THAN MAXVALUE );
Dans l'exemple ci-dessus, une table de partition de plage contenant 3 partitions (t21, t22, t23) est définie Ceci. Elle est quelque peu similaire à l'<a href="http://www.php.cn/code/5745.html" target="_blank">instruction switch <code>这个有点类似与高级语言中的<a href="http://www.php.cn/code/5745.html" target="_blank">switch语句</a>
dans les langages de haut niveau. L'explication est la suivante : lorsque id<10, il est dans la partition t21 ; lorsque 20>id>=10, il est dans la partition t22 ; lorsque id>=20, il est dans la partition t23.
Exemple 2 :
CREATE TABLE `test`.`partition_t3`( `id` INT UNSIGNED NOT NULL, `username` VARCHAR(30) NOT NULL, `email` VARCHAR(30) NOT NULL, `birth_date` DATE NOT NULL ) ENGINE=MYISAM PARTITION BY RANGE COLUMNS(birth_date)( PARTITION t31 VALUES LESS THAN ('1996-01-01'), PARTITION t32 VALUES LESS THAN ('2006-01-01'), PARTITION t33 VALUES LESS THAN ('2038-01-01') );
MySQL5.5 améliore le partitionnement de plage et fournit un partitionnement de colonnes de plage pour prendre en charge le partitionnement nonentier.
list partition crée une liste discrète de valeurs (similaire aux données de type enum dans MySQL) à partitionner, utilisez l'opérateur values in
à partitionner. Les partitions de liste n'ont pas besoin d'être déclarées dans un ordre particulier. Les listes sont similaires aux plages à bien des égards.
CREATE TABLE `test`.`partition_t4`( `id` INT UNSIGNED NOT NULL, `username` VARCHAR(30) NOT NULL, `email` VARCHAR(30) NOT NULL, `birth_date` DATE NOT NULL ) ENGINE=MYISAM PARTITION BY LIST(id)( PARTITION t41 VALUES IN (1,2), PARTITION t42 VALUES IN (3,6), PARTITION t43 VALUES IN (5,4), PARTITION t44 VALUES IN (7,8) );
L'exemple ci-dessus est que lorsque l'identifiant est 1 ou 2, il est partitionné en t41 ; lorsque l'identifiant est 3 ou 6, il est partitionné en t42, et ainsi de suite...
La partition de hachage est principalement utilisée pour disperser les lectures de points d'accès afin de garantir que les données sont réparties aussi uniformément que possible entre un nombre prédéterminé de partitions. Lorsqu'une table effectue un partitionnement par hachage, MySQL applique une fonction de hachage à la clé de partition pour déterminer dans laquelle des n partitions les données doivent être placées. La partition de hachage prend en charge deux fonctions de hachage (méthodes de partitionnement) : 取模算法(默认hash分区方式)
et 线性的2的幂的运算法则(liner hash 分区)
.
#顶部引例就是常规hash分区
MySQL ne recommande pas l'utilisation d'expressions de hachage impliquant plusieurs colonnes.
Le hachage conventionnel entraîne trop de coûts dans la gestion des partitions et n'est pas adapté aux besoins des partitions flexibles. Voir : Algorithme de hachage cohérent
En raison des problèmes de gestion du partitionnement de hachage conventionnel, tous les MySQL introduit un partitionnement de hachage linéaire.
CREATE TABLE `test`.`partition_t5`( `id` INT UNSIGNED NOT NULL, `username` VARCHAR(30) NOT NULL, `email` VARCHAR(30) NOT NULL, `birth_date` DATE NOT NULL ) ENGINE=MYISAM PARTITION BY LINEAR HASH(id) PARTITIONS 5;
Dans l'exemple ci-dessus, une partition de hachage linéaire de 5 partitions est créée.
Avantages du partitionnement de hachage linéaire : MySQL peut gérer la maintenance des partitions plus rapidement
线性hash分区缺点:分区各个分区之间数据分布不太均衡。
hash分区允许用户自定义的表达式,而key分区不允许使用用户自定义的表达式。
hash分区只支持整数分区,key分区支持除了blob或text类型之外的其他数据类型分区。
与hash分区不同,创建key分区表的时候,可以不指定分区键,默认会选择使用主键/唯一键作为分区键,没有主键/唯一键,必须指定分区键。
CREATE TABLE `test`.`partition_t6`( `id` INT UNSIGNED NOT NULL, `username` VARCHAR(30) NOT NULL, `email` VARCHAR(30) NOT NULL, `birth_date` DATE NOT NULL ) ENGINE=MYISAM PARTITION BY LINEAR KEY(email) PARTITIONS 5;
columns 包括range columns与list columns 支持非整型的分区键。columns分区支持多列分区
。
CREATE TABLE `test`.`partition_t7`( `a` INT UNSIGNED NOT NULL, `b` INT UNSIGNED NOT NULL ) PARTITION BY RANGE COLUMNS(a,b)( PARTITION p0 VALUES LESS THAN (0,10), PARTITION p1 VALUES LESS THAN (10,10), PARTITION p2 VALUES LESS THAN (10,20), PARTITION p3 VALUES LESS THAN (10,35), PARTITION p4 VALUES LESS THAN (10,MAXVALUE), PARTITION p5 VALUES LESS THAN (MAXVALUE,MAXVALUE) );
判断依据:(a<10) or ((1=10) and (10<10))。
子分区是分区表中对每一个分区的再次分割,又被称为复合分区。MySQL从MySQL5.1开始支持对通过range和list的表再进行子分区,子分区即可以hash分区,也可以使用key分区。子分区适合保存非常大量的数据记录。
CREATE TABLE partition_t8(id INT,purchased DATE) PARTITION BY RANGE(YEAR(purchased)) SUBPARTITION BY HASH(TO_DAYS(purchased)) SUBPARTITIONS 2( PARTITION p0 VALUES LESS THAN (1990), PARTITION p1 VALUES LESS THAN (2000), PARTITION p2 VALUES LESS THAN MAXVALUE );
MySQL5.1提供添加、删除、重定义、合并、拆分分区命令。
#删除分区 alter table partition_t8 drop partition p2; #添加一个分区 alter table partition_t8 add partition( partition p4 values less than (2030) ) #重定义一个分区 alter table partition_t8 reorganize partition p3 into( partition p2 values less than (2005), partition p3 values less than (2015) );
只能从range分区列表最大端增加分区。
增加list分区,不能添加一个包含现有分区值列表中的任意值分区,也就是说对一个固定的分区键值,必须指定并且只能指定一个唯一的分区。
重新定义range分区,只能够重新定义相邻的分区,同时重新定义的分区区间必须和原分区区间覆盖相同的区间。
#减少分区数,(如将分区数减少到2) alter table partition_t8 coalesce partition 2; #增加分区数(如:为分区数增加了8) alter table partiton_t8 add partition partitions 8;
coalesce不能用来增加分区数量。
【相关推荐】
2. MySQL最新手册教程
3. 数据库设计那些事
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!