Maison > Article > base de données > Explication détaillée du code des quatre types de partitions des tables MySQL
Je n'ai implémenté que les quatre partitions de base de données suivantes : RANGE (plage) partition. Il existe trois autres types que j'essaierai d'implémenter plus tard. Les amis qui l'ont implémenté peuvent partager ce qu'ils ont. pense que c'est un bon article
1 Qu'est-ce que le partitionnement de table
En termes simples, table. le partitionnement est une grande table. Les conditions sont divisées en plusieurs petites tables. Mysql5.1 commence à prendre en charge le partitionnement des tables de données. Par exemple, si une table utilisateur contient plus de 6 millions d'enregistrements, la table peut être partitionnée en fonction de la date d'entrée dans la base de données, ou la table peut être partitionnée en fonction de l'emplacement. Bien entendu, le partitionnement peut également être basé sur d’autres conditions.
2. Pourquoi partitionner la table
Afin d'améliorer l'évolutivité, la gérabilité et l'efficacité de la base de données des grandes tables et des tables avec différents modes d'accès. Certains avantages des partitions
incluent :
peut stocker plus de données qu'un seul disque ou une partition Système de fichiers.
Pour les données qui ont perdu leur sens, vous pouvez généralement les supprimer facilement en supprimant les partitions liées à ces données. Au contraire, dans certains cas, le processus d'ajout de nouvelles données peut être facilement mis en œuvre en ajoutant une nouvelle partition spécifiquement pour ces nouvelles données. D'autres avantages communément associés au partitionnement sont ceux répertoriés ci-dessous. Ces fonctionnalités de partitionnement MySQL ne sont pas encore implémentées, mais figurent en bonne place sur notre liste de priorités ; nous espérons les inclure dans la version de production 5.1.
Certaines requêtes peuvent être grandement optimisées, principalement grâce au fait que les données qui satisfont une instruction WHERE donnée peuvent être stockées dans une ou plusieurs partitions seulement, de sorte qu'il n'est pas nécessaire de rechercher d'autres partitions restantes lors de la recherche. Étant donné que le partitionnement peut être modifié après la création de la table partitionnée, vous pouvez réorganiser les données pour améliorer l'efficacité des requêtes couramment utilisées si vous ne l'avez pas fait lors de la première configuration du schéma de partitionnement.
Les requêtes impliquant des fonctions d'agrégation telles que SUM() et COUNT() peuvent être facilement traitées en parallèle. Un exemple simple d'une telle requête est "SELECT salesperson_id, COUNT (orderers) as order_total FROM sales GROUP BY salesperson_id;". Par « parallèle », cela signifie que la requête peut être exécutée sur chaque partition simultanément, et que le résultat final est simplement la somme des résultats obtenus par toutes les partitions.
Obtenez un meilleur débit de requêtes en répartissant les requêtes de données sur plusieurs disques.
3. Type de partition
Partitionnement RANGE : allouez plusieurs lignes aux partitions en fonction des valeurs de colonnes appartenant à une plage continue donnée.
Partitionnement LISTE : Semblable au partitionnement par RANGE, la différence est que le partitionnement LISTE est sélectionné en fonction de la valeur de colonne correspondant à une certaine valeur dans un ensemble de valeurs discrètes.
Partitionnement HASH : une partition sélectionnée en fonction de la valeur de retour d'une expression définie par l'utilisateur qui est calculée à l'aide des valeurs de colonne des lignes à insérer dans la table. Cette fonction peut contenir n'importe quelle expression valide dans MySQL qui produit une valeur entière non négative.
Partitionnement KEY : Semblable au partitionnement HASH, la différence est que le partitionnement KEY ne prend en charge que le calcul d'une ou plusieurs colonnes et que le serveur MySQL fournit sa propre fonction de hachage. Il doit y avoir une ou plusieurs colonnes contenant des valeurs entières.
Attribue plusieurs lignes aux partitions en fonction des valeurs de colonnes appartenant à une plage contiguë donnée.
Ces intervalles doivent être continus et ne peuvent pas se chevaucher. Utilisez l'opérateur VALEURS INFÉRIEURES À pour les définir. Vous trouverez ci-dessous des exemples.
Code SQL :
CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR(30), lname VARCHAR(30), hired DATE NOT NULL DEFAULT '1970-01-01', separated DATE NOT NULL DEFAULT '9999-12-31', job_code INT NOT NULL, store_id INT NOT NULL )
partition BY RANGE (store_id) ( partition p0 VALUES LESS THAN (6), partition p1 VALUES LESS THAN (11), partition p2 VALUES LESS THAN (16), partition p3 VALUES LESS THAN (21) );
Selon ce schéma de partitionnement, toutes les lignes correspondant aux employés travaillant dans les magasins 1 à 5 sont enregistrées dans la partition P0, Employés dans les magasins 6 à 10 sont enregistrés dans P1, et ainsi de suite. Notez que chaque partition est définie séquentiellement, de la plus basse à la plus élevée. Il s'agit d'une exigence de la syntaxe PARTITION BY RANGE ; à cet égard, elle est similaire à une instruction "switch ... case" en C ou Java. Pour une nouvelle ligne contenant les données (72, 'Michael', 'Widenius', '1998-06-25', NULL, 13), il est facile de déterminer qu'elle sera insérée dans la partition p2, mais si un nombre est ajouté Qu'arrivera-t-il au 21ème magasin ? Dans ce scénario, puisqu'il n'existe aucune règle pour inclure les magasins avec un store_id supérieur à 20, le serveur ne saura pas où enregistrer la ligne, ce qui entraînera une erreur. Cette erreur peut être évitée en utilisant une clause "catchall" VALUES LESS THAN dans l'instruction CREATE TABLE qui donne toutes les valeurs supérieures à une valeur la plus élevée explicitement spécifiée :
Code SQL :
CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR(30), lname VARCHAR(30), hired DATE NOT NULL DEFAULT '1970-01-01', separated DATE NOT NULL DEFAULT '9999-12-31', job_code INT NOT NULL, store_id INT NOT NULL )
PARTITION BY RANGE (store_id) ( PARTITION p0 VALUES LESS THAN (6), PARTITION p1 VALUES LESS THAN (11), PARTITION p2 VALUES LESS THAN (16), PARTITION p3 VALUES LESS THAN MAXVALUE );
MAXVALUE 表示最大的可能的整数值。现在,store_id 列值大于或等于16(定义了的最高值)的所有行都将保存在分区p3中。在将来的某个时候,当商店数已经增长到25, 30, 或更多 ,可以使用ALTER TABLE语句为商店21-25, 26-30,等等增加新的分区。在几乎一样的结构中,你还可以基于雇员的工作代码来分割表,也就是说,基于job_code 列值的连续区间。例如——假定2位数字的工作代码用来表示普通(店内的)工人,三个数字代码表示办公室和支持人员,四个数字代码表示管理层,你可以使用下面的语句创建该分区表:
Sql代码:
CREATE TABLE employees ( id INT NOT NULL, fname VARCHAR(30), lname VARCHAR(30), hired DATE NOT NULL DEFAULT '1970-01-01', separated DATE NOT NULL DEFAULT '9999-12-31', job_code INT NOT NULL, store_id INT NOT NULL )
PARTITION BY RANGE (job_code) ( PARTITION p0 VALUES LESS THAN (100), PARTITION p1 VALUES LESS THAN (1000), PARTITION p2 VALUES LESS THAN (10000) );
在这个例子中, 店内工人相关的所有行将保存在分区p0中,办公室和支持人员相关的所有行保存在分区p1中,管理层相关的所有行保存在分区p2中。在VALUES LESS THAN 子句中使用一个表达式也是可能的。这里最值得注意的限制是MySQL 必须能够计算表达式的返回值作为LESS THAN (ad79d2732f294f8b8c01b7007dba89e0= num: · 设置 V = CEIL(V / 2) · 设置 N = N & (V – 1) 例如,假设表t1,使用线性哈希分区且有4个分区,是通过下面的语句创建的: CREATE TABLE t1 (col1 INT, col2 CHAR(5), col3 DATE) PARTITION BY LINEAR HASH( YEAR(col3) ) PARTITIONS 6; 现在假设要插入两行记录到表t1中,其中一条记录col3列值为’2003-04-14′,另一条记录col3列值为’1998-10-19′。第一条记录将要保存到的分区确定如下: V = POWER(2, CEILING(LOG(2,7))) = 8 N = YEAR(’2003-04-14′) & (8 – 1) = 2003 & 7 = 3 (3 >= 6 为假(FALSE): 记录将被保存到#3号分区中) 第二条记录将要保存到的分区序号计算如下: V = 8 N = YEAR(’1998-10-19′) & (8-1) = 1998 & 7 = 6 (6 >= 4 为真(TRUE): 还需要附加的步骤) N = 6 & CEILING(5 / 2) = 6 & 3 = 2 (2 >= 4 为假(FALSE): 记录将被保存到#2分区中) 按照线性哈希分区的优点在于增加、删除、合并和拆分分区将变得更加快捷,有利于处理含有极其大量(1000吉)数据的表。它的缺点在于,与使用常规HASH分区得到的数据分布相比,各个分区间数据的分布不大可能均衡。
类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。
Sql代码:
CREATE TABLE tk ( col1 INT NOT NULL, col2 CHAR(5), col3 DATE ) PARTITION BY LINEAR KEY (col1) PARTITIONS 3;
在KEY分区中使用关键字LINEAR和在HASH分区中使用具有同样的作用,分区的编号是通过2的幂(powers-of-two)算法得到,而不是通过模数算法。
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!