partition de base de données MySQL

Annuaire d'articles


La version de MySQL que j'ai installée est la version communautaire 8.0.34. Si ce qui suit implique l'exécution de SQL, la plupart des explications seront basées sur cette version.

1. Qu'est-ce que la partition

Ce qu'on appelle le partitionnement consiste à diviser une table en plusieurs blocs pour le fonctionnement et le stockage, réduisant ainsi les données requises pour chaque opération et améliorant les performances. Elle est transparente pour l'application. Logiquement il n'y a qu'une seule table, mais physiquement cette table peut être composée de plusieurs partitions physiques. Chaque partition est un objet indépendant et peut être traitée indépendamment. en bref:未分区的表所有数据物理层面存储在同一个文件中,分区的表会按分区数量存储到不同的文件中,提高查询效率

Voici la différence entre le partitionnement et le non-partitionnement au niveau physique.
Insérer la description de l'image ici

Le partitionnement est un modèle de conception de table. Un partitionnement correct peut considérablement améliorer l'efficacité des requêtes de la base de données et compléter une programmation SQL de meilleure qualité. Mais s’il est mal utilisé, le partitionnement peut avoir des conséquences dévastatrices.

La base de données MySQL a ajouté la prise en charge du partitionnement dans la version 5.1 et supérieure. La fonction de partitionnement n'est pas terminée au niveau de la couche moteur de stockage. Les moteurs de stockage courants InnoDB, MyISAM, NDB, etc. prennent tous en charge le partitionnement. Cependant, tous les moteurs de stockage ne le prennent pas en charge. Par exemple, CSV, FEDORATED, MERGE, etc. ne prennent pas en charge le partitionnement. Seuls les moteurs de stockage InnoDB et NDB prennent en charge le partitionnement pour mysql8 et versions ultérieures.

Pour plus de détails sur le partitionnement, veuillez consulter le site officiel Partitionnement

1.1. Type de partition (partition horizontale, partition verticale)

  • Partitionnement horizontal : les lignes d'une table peuvent être affectées à différentes partitions physiques.
  • Partitionnement vertical : attribuez différentes colonnes de la table à différentes partitions physiques. (MySQL 8.0 ne prend pas en charge le partitionnement vertical et il n'est actuellement pas prévu d'introduire le partitionnement vertical dans MySQL)

De plus, la partition de la base de données MySQL est un index de partition local, et les données et les index sont stockés dans une seule partition. Le partitionnement global signifie que les données sont stockées dans chaque partition, mais que les index de toutes les données sont placés dans un seul objet. Actuellement, la base de données MySQL ne prend pas en charge le partitionnement global.

1.2. Avantages et inconvénients du partitionnement de table

Avantages du cloisonnement :

  1. Une seule table peut stocker plus de données.
  2. Les données d'une table partitionnée sont plus faciles à conserver. De grandes quantités de données peuvent être supprimées par lots en effaçant la partition entière, ou de nouvelles partitions peuvent être ajoutées pour prendre en charge les données nouvellement insérées. De plus, vous pouvez également effectuer des opérations telles que l'optimisation, l'inspection et la réparation sur une partition indépendante.
  3. Certaines requêtes peuvent être déterminées à partir des conditions de requête pour ne concerner que quelques partitions, et la vitesse sera très rapide (les conditions de requête analysent le moins de partitions possible).
  4. Les données de la table de partition peuvent également être distribuées sur différents périphériques physiques, utilisant ainsi efficacement plusieurs périphériques matériels.
  5. Les tables de partition peuvent être utilisées pour éviter certains goulots d'étranglement particuliers, tels que l'accès mutuellement exclusif à un seul index dans InnoDB et la compétition de verrouillage d'inodes dans le système de fichiers ext3.
  6. Les partitions individuelles peuvent être sauvegardées et restaurées.
  7. 对于查询分区表的SELECT语句,建议包含分区列,这样就只会在这个分区内查询,不用全表搜索,效率更快

Limites et inconvénients du partitionnement :

  1. Dans les versions antérieures à MySQL 5.6.7, une table peut avoir jusqu'à 1 024 partitions ; à partir de la version 5.6.7, une table peut avoir jusqu'à 8 192 partitions.
  2. 如果一个表有主键,那么MYSQL的分区字段必须包含在主键内,也就是分区字段必须是主键的一部分或者全部,不能以非主键的字段作为分区字段。当然,也可以为没有主键的表建立分区。
  3. Les tables partitionnées ne peuvent pas utiliser de contraintes de clé étrangère.
  4. Une valeur NULL invalidera le filtrage des partitions.
  5. Toutes les partitions doivent utiliser le même moteur de stockage.

1.3. La différence entre le partitionnement de table et le partitionnement de table

Fractionnement de table : fait référence à la décomposition d'une table en plusieurs tables différentes selon certaines règles. Par exemple, les enregistrements de transactions bancaires sont divisés en plusieurs tableaux par mois en fonction du temps.

La différence entre le fractionnement de table et le partitionnement est que le partitionnement n'a logiquement qu'une seule table (bien qu'il existe plusieurs fichiers de table au niveau physique), tandis que le fractionnement de table divise une table en plusieurs tables.

Comme suit : Après avoir créé une table de partition, il y aura plusieurs fichiers de table au niveau physique.

create table if not exists product
(
	id int not null ,
	name varchar(20) null comment '商品名称',
	type varchar(20) not null comment '商品类型',
    primary key(id,type)
) partition by key(type) partitions 4;  -- 根据商品类型进行分区

Insérer la description de l'image ici

2. Type de partition

Les méthodes de partitionnement peuvent être divisées en quatre types : partitionnement par plage, partitionnement par liste, partitionnement par hachage et partitionnement par clé.
(1) Partitionnement de plages : divisez les partitions en fonction de plages continues, par exemple par mois. Par exemple, les ID 1 à 100 sont alloués ensemble, 101 à 200 sont alloués ensemble, 201 à 300 sont alloués ensemble, etc. (2) Partitionnement de
liste : Divisez les partitions selon des listes de valeurs discrètes, telles que les pays, les provinces, les villes, etc. Par exemple, rassemblez les valeurs 1, 3 et 5 en fonction du champ, et rassemblez les valeurs 2, 4 et 6, etc. (3
) Partitionnement par hachage : partitionnez par hachage les données en fonction de l'utilisateur. règles définies.
(4) Partition de clé : similaire à la partition de hachage, mais les données sont traitées selon les propres règles du moteur MySQL.
(5) partition de colonnes : les partitions RANGE, LIST et HASH antérieures à la version 5.5 nécessitent que la clé de partition soit un entier ; MySQL 5.5 et supérieur prend en charge les partitions RANGE et LIST non entières, c'est-à-dire : les colonnes de plage et les colonnes de liste (les chaînes peuvent être utilisé pour partitionner).

Lors de l'utilisation d'une table partitionnée, nous devons faire attention aux détails suivants :
(1) S'il y a une clé primaire ou une clé unique dans la table, la colonne de partitionnement doit être un composant de la clé secondaire ou de la clé unique, c'est-à-dire la fonction de partition Les colonnes ne peuvent être que des sous-ensembles des clés pk ou uk
(2) S'il n'y a pas de clé paimary ou de clé unique dans la table, vous pouvez spécifier n'importe quelle colonne comme colonne de partition
(3) Lorsque vous utilisez une table partitionnée, vous devez spécifier une liste de partitions. Le type de données de la colonne de partition doit correspondre à la méthode de partition.
(4) Si vous devez créer une partition à plusieurs niveaux, il vous suffit d'écrire les informations de la partition de deuxième niveau entre parenthèses lors de la création de la partition de premier niveau.
(5) L'instruction SELECT qui interroge une table partitionnée doit inclure la colonne de partition, et lorsque vous interrogez uniquement les données d'une partition spécifique, vous devez utiliser une syntaxe similaire à "SELECT * FROM commandes PARTITION (p2010)".
(6) 分区的命名默认是p0,p1,p2.........并且分区名称不区分大小写
(6)全表查询时,分区表默认排序是按分区排序,而不是按主键排序

2.1. Partition RANGE ( document officiel )

Le partitionnement RANGE est le type de partitionnement le plus couramment utilisé, qui attribue plusieurs lignes aux partitions en fonction des valeurs de colonne appartenant à une plage continue donnée. Ces intervalles doivent être continus et ne peuvent pas se chevaucher. Ils sont définis à l'aide de l'opérateur VALUES LESS THAN .不使用COLUMNS关键字时RANGE括号内必须为整数字段名或返回确定整数的函数。

Caractéristiques des partitions RANG :

  • Stockez différentes données dans différentes partitions de la table en fonction de la plage de valeurs de clé de partition.
  • La plage de valeurs de clé de partition pour plusieurs partitions doit être continue mais ne peut pas se chevaucher.
  • L'attribut VALUES LESS THAN est utilisé par défaut, mais chaque partition n'inclut pas la valeur spécifiée.

2.1.1. Créer une partition RANGE

Ce qui suit crée une table de partition d'intervalle avec la colonne id. Lorsque l'identifiant est inférieur à 10, les données sont insérées dans la partition p0 ; lorsque l'identifiant est supérieur ou égal à 10 et inférieur à 20, les données sont insérées dans la partition p0. partition p1. le code s'affiche comme ci-dessous :

create  table  t(
  id int
)engine=innodb
partition by range(id)(
     partition  p0  values  less  than(10),-- 存放<10的数据
     partition  p1  values  less  than(20)-- 存放>=10  <20的数据
);

Après avoir créé une partition, lorsque nous insérons des données, mysql insère automatiquement les données dans la partition correspondante en fonction de la valeur des données.

insert into t values (9);
insert into t values (11);

Après avoir inséré les données ci-dessus, affichez les partitions :

-- 查看p0分区的数据
SELECT * FROM t PARTITION (p0);

Le résultat est le suivant :
Insérer la description de l'image ici

Après avoir partitionné la table, la valeur des données insérées doit être strictement conforme à la définition de la partition. Lors de l'insertion d'une valeur qui n'appartient à aucune partition, la base de données MySQL signalera directement une erreur. comme suit:
Insérer la description de l'image ici
[HY000][1526] Table has no partition for value 40

Afin d'éviter que cela ne se produise, nous pouvons ajouter une partition avec une valeur MAXVALUE à la partition. MAXVALUE peut être compris comme un infini positif, donc toutes les valeurs supérieures ou égales à 20 et inférieures à MAXVALUE sont mises dans la partition p2 .

alter table t add partition(partition p2 values less than maxvalue);

A ce moment, toutes les valeurs >=20 seront insérées dans la partition p2.

2.1.2. Partitionnement de plages de types de champs date et horodatage

J'ai pris le cas d'utilisation directement sur le site officiel. Pour plus d'informations, consultez le site officiel
RANGE Partitioning .

 CREATE TABLE members (
    firstname VARCHAR(25) NOT NULL,
    lastname VARCHAR(25) NOT NULL,
    username VARCHAR(16) NOT NULL,
    email VARCHAR(35),
    joined DATE NOT NULL
)
PARTITION BY RANGE( YEAR(joined) ) (
    PARTITION p0 VALUES LESS THAN (1960),
    PARTITION p1 VALUES LESS THAN (1970),
    PARTITION p2 VALUES LESS THAN (1980),
    PARTITION p3 VALUES LESS THAN (1990),
    PARTITION p4 VALUES LESS THAN MAXVALUE
);
CREATE TABLE quarterly_report_status (
    report_id INT NOT NULL,
    report_status VARCHAR(20) NOT NULL,
    report_updated TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
)
PARTITION BY RANGE ( UNIX_TIMESTAMP(report_updated) ) (
    PARTITION p0 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-01-01 00:00:00') ),
    PARTITION p1 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-04-01 00:00:00') ),
    PARTITION p2 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-07-01 00:00:00') ),
    PARTITION p3 VALUES LESS THAN ( UNIX_TIMESTAMP('2008-10-01 00:00:00') ),
    PARTITION p4 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-01-01 00:00:00') ),
    PARTITION p5 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-04-01 00:00:00') ),
    PARTITION p6 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-07-01 00:00:00') ),
    PARTITION p7 VALUES LESS THAN ( UNIX_TIMESTAMP('2009-10-01 00:00:00') ),
    PARTITION p8 VALUES LESS THAN ( UNIX_TIMESTAMP('2010-01-01 00:00:00') ),
    PARTITION p9 VALUES LESS THAN (MAXVALUE)
);

2.2. Partition LIST ( document officiel )

Le partitionnement LISTE est similaire au partitionnement RANGE, la différence est que le partitionnement LISTE est sélectionné en fonction des valeurs de colonne correspondant à une certaine valeur dans un ensemble de valeurs discrètes, plutôt que continue.

Le partitionnement de LISTE est obtenu en utilisant " PARTITION BY LIST(expr) ", où " expr " est une valeur de colonne ou une expression basée sur une valeur de colonne et renvoie une valeur entière, puis via " VALUES IN (value_list) " pour définir chaque partition, où "value_list" est une liste d'entiers séparés par des virgules.

Caractéristiques de la partition LISTE :

  • Partitionner par liste de valeurs de clés de partition
  • Comme pour le partitionnement par plage, les valeurs de la liste dans chaque partition ne peuvent pas être répétées.
  • Chaque ligne de données doit pouvoir trouver la liste de partitions correspondante, sinon l'insertion des données échoue.
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,
    store_id INT
)
PARTITION BY LIST(store_id) (
    PARTITION pNorth VALUES IN (3,5,6,9,17),
    PARTITION pEast VALUES IN (1,2,10,11,19,20),
    PARTITION pWest VALUES IN (4,12,13,14,18),
    PARTITION pCentral VALUES IN (7,8,15,16)
);

2.3.Partition HASH ( document officiel )

Caractéristiques de la partition HASH :

  • Stockez les lignes de données dans différentes partitions de la table en fonction de la valeur de MOD (clé de partition, nombre de partitions)
  • Les données peuvent être réparties uniformément entre différentes partitions
  • La valeur clé de la partition HASH doit être une valeur de type INT, ou elle peut être convertie en type INT via une fonction
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,
    store_id INT
)
PARTITION BY HASH( YEAR(hired) )
PARTITIONS 4;

Si vous insérez un enregistrement dans employés et que sa valeur d'embauche est « 2005-09-15 », alors la partition où il est stocké est la suivante :

MOD(YEAR('2005-09-01'),4)
=  MOD(2005,4)
=  1

2.4, partition de clé

Le partitionnement par clé est similaire au partitionnement par hachage, sauf que le partitionnement par hachage utilise une expression définie par l'utilisateur et que la fonction de hachage utilisée pour le partitionnement par clé est fournie par le serveur MySQL. NDB Cluster utilise MD5() à cet effet ; pour les tables utilisant d'autres moteurs de stockage, le serveur utilise sa propre fonction de hachage interne.

Le partitionnement par clé est similaire à la méthode de création d'une table partitionnée par hachage. Les principales différences sont les suivantes :

  • Utilisez KEY au lieu de HASH.
  • KEY n'accepte qu'une liste de zéro ou plusieurs noms de colonnes. Toute colonne utilisée comme clé de partition doit contenir tout ou partie de la clé primaire de la table (si la table en a une). Si aucun nom de colonne n'est spécifié comme clé de partition, la clé primaire de la table est utilisée (s'il y en a une). Par exemple, l'instruction CREATE TABLE suivante est valide dans MySQL 8.0 :

Exemple 1:

CREATE TABLE k1 (
    id INT NOT NULL PRIMARY KEY,
    name VARCHAR(20)
)
PARTITION BY KEY() -- 注意这里的key()没有指定列,则默认是按主键分区
PARTITIONS 2;

Exemple 2 :

CREATE TABLE tm1 (
    s1 CHAR(32) PRIMARY KEY
)
PARTITION BY KEY(s1)
PARTITIONS 10;

2.5. Partition COLONNES

Adresse du site Web officiel : Partitionnement RANGE COLUMNS / Partitionnement LIST COLUMNS
Le partitionnement COLUMNS est un type de partition introduit dans MYSQL5.5. Le but de l'introduction du partitionnement COLUMNS est de résoudre le problème selon lequel le partitionnement RANGE et le partitionnement LIST dans les versions antérieures à MYSQL5.5 ne prennent en charge que le partitionnement entier. , qui nécessite des calculs de fonction supplémentaires pour obtenir des entiers ou des tables de conversion supplémentaires pour les convertir en entiers dans des partitions. Les partitions COLUMNS peuvent être subdivisées en partitions RANGE COLUMNS et en partitions LIST COLUMNS. Elles prennent toutes deux en charge trois types de données principaux : entiers, dates et chaînes :

  • Tous les types entiers : tinyint, smallint, mediumint, int (Integer), bigint, les autres types numériques ne sont pas pris en charge, tels que Decimal et Float.
  • Types de date et d'heure : date, dateheure
  • Types de caractères : les types char, varchar, binaire, varbinary, texte et blob ne sont pas pris en charge comme clés de partition.
    Remarque : La partition COLUMNS ne prend en charge qu'un ou plusieurs noms de champ comme clés de partition et ne prend pas en charge les expressions comme clés de partition. (Différent du partitionnement RANGE et du partitionnement LIST), utilisez le partitionnement RANGE COLUMNS de plusieurs colonnes comme suit :

2.5.1、Colonnes de plage

Les partitions RANGE COLUMNS diffèrent considérablement des partitions RANGE des manières suivantes :

  • RANGE COLUMNS n'accepte pas les expressions, uniquement les noms de colonnes.
  • RANGE COLUMNS accepte une liste d’une ou plusieurs colonnes.

grammaire:

CREATE TABLE table_name
PARTITION BY RANGE COLUMNS(column_list) (
    PARTITION partition_name VALUES LESS THAN (value_list)[,
    PARTITION partition_name VALUES LESS THAN (value_list)][,
    ...]
)

column_list:
    column_name[, column_name][, ...]

value_list:
    value[, value][, ...]

Exemple 1:

CREATE TABLE rcx (
    a INT,
    b INT,
    c CHAR(3),
    d INT
)
PARTITION BY RANGE COLUMNS(a,d,c) (
    PARTITION p0 VALUES LESS THAN (5,10,'ggg'),
    PARTITION p1 VALUES LESS THAN (10,20,'mmm'),
    PARTITION p2 VALUES LESS THAN (15,30,'sss'),
    PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE,MAXVALUE)
);

Exemple 2 :

-- 对日期类型的分区,不再需要year()函数了,而直接使用columns
create table t_columns(
a int,
b datetime
)engine=innodb
partition by range columns (b) (
partition p0 values less than ('2009-01-01'),
partition p1 values less than ('2010-01-01')
);

-- 可以直接使用字符串的分区
create table t_columns2(
a int,
b datetime,
city varchar(15)
)engine=innodb
partition by list columns(city) (
partition p1 values in ('a','b','c'),
partition p2 values in ('d','e','f'),
partition p3 values in ('g','h','k'),
);

-- 可以使用多个列进行分区:
create table rcx (
a int,
b int,
c char(3)
)engine=innodb
partition by range columns(a,b,c) (
partition p0 values 
);

3. Champs de partition et clés primaires

Le champ de partition MYSQL doit être inclus dans le champ de clé primaire ou dans la colonne d'index unique. Si une table possède une clé primaire ou une colonne d'index unique, alors le champ de partitionnement doit être inclus dans la colonne de clé primaire ou d'index unique, c'est-à-dire que tous les champs partitionnés doivent appartenir à une partie ou à la totalité de la clé primaire ou de la colonne d'index unique, et ne peut pas être indexé avec une clé non primaire et des colonnes non uniques. Les champs de colonne servent de champs de partition. Bien entendu, vous pouvez également créer des partitions pour les tables sans clés primaires.

Lors du partitionnement d'une table, si le champ de partition n'est pas inclus dans le champ de clé primaire, une erreur sera directement signalée.

Supposons que la clé primaire d'une table est id et que nous souhaitons utiliser le champ de date comme champ de partition. Dans ce cas, le champ de date doit être utilisé dans le cadre de la clé primaire. Vous pouvez créer une clé primaire combinée de ( id, date), sinon une erreur sera signalée directement lors de la création d'une partition.

4. Utilisation des partitions

4.1. Demander si la base de données prend en charge le partitionnement

La fonction de partitionnement a été introduite depuis MySQL 5.1. Vous pouvez vérifier si elle est prise en charge comme suit :

Ancienne version (avant 5.6) :

SHOW VARIABLES LIKE '%partition%';

Si la sortie : have_partitioning OUI, cela signifie que le partitionnement est pris en charge et est activé par défaut.
Insérer la description de l'image ici

Nouvelle version (après 5.6) :

show plugins;

Afficher tous les plug-ins. S'il y a une partition - ACTIVE - STORAGE ENGINE - plug-in GPL, cela indique que le partitionnement est pris en charge.
Insérer la description de l'image ici

mysql8.0 SHOW PLUGINS 命令输出以及 INFORMATION_SCHEMA.PLUGINS 表不再显示 partition。

4.2. Créer des partitions

create table if not exists product
(
	id int not null ,
	name varchar(20) null comment '商品名称',
	type varchar(20) not null comment '商品类型',
    primary key(id,type)
) partition by key(type) partitions 4;  -- 根据商品类型进行分区,创建4个分区


insert into product values
(1,'格力空调','空调'),
(2,'美的空调','空调'),
(3,'九阳电饭煲','电饭煲'),
(4,'苏泊尔电饭煲','电饭煲'),
(5,'小米手机','手机'),
(6,'华为手机','手机');

Lors de la création d'une partition, si seul le nombre de partitions est spécifié mais qu'aucun nom de partition n'est spécifié, le nom de la partition commence à 0 par défaut, p0, p1, p2...
Insérer la description de l'image ici

4.3. Créez une partition et spécifiez le nom de la partition

create table if not exists tt
(
	id int not null primary key,
   name varchar(20) null comment '商品名称'
)engine=InnoDB partition by hash(id) partitions 3 (partition t1,partition t2,partition t3);

Insérer la description de l'image ici

4.4. Vérifiez quelles tables du schéma sont des tables partitionnées/combien de partitions chaque table possède/combien de partitions ont été utilisées/nom de la partition/la quantité de données dans chaque partition

select * 
FROM information_schema.PARTITIONS 
WHERE TABLE_SCHEMA=SCHEMA();

或者

select * 
FROM information_schema.PARTITIONS 
WHERE TABLE_SCHEMA='your schema name';

Le contenu du département d'interception SQL d'exécution est le suivant :
Insérer la description de l'image ici
Dans l'image ci-dessus, nous pouvons voir les informations de toutes les tables de la bibliothèque avec test de schéma : s'il faut partitionner, nom de la partition, nombre de partitions, type de partition (liste, plage, clé, hachage), champ de partition, chacun La quantité de données dans chaque partition et ainsi de suite.

Le SQL ci-dessus interroge les informations de toutes les tables de la bibliothèque avec le schéma défini pour tester, pas seulement les informations de la table de partition. Bien sûr, nous pouvons modifier l'instruction SQL pour interroger uniquement les informations de la table de partition, comme suit : Pour plus d'informations, veuillez vous référer au
Insérer la description de l'image ici
注意:information_schema.partitions对于InnoDB表,table_rows行计数仅是大概估计值,不准确。所以有时候可能会有误差仅作为参考
site officiel . La table INFORMATION_SCHEMA PARTITIONS

4.5. Demander si la table est une table partitionnée

Méthode 1 : Utilisez la commande show create table pour afficher l'instruction ddl.
Comme indiqué ci-dessous, grâce à l'instruction ddl affichée, il s'avère que la table est une table partitionnée.

mysql> show create table product;
ERROR 2013 (HY000): Lost connection to MySQL server during query
No connection. Trying to reconnect...
Connection id:    58
Current database: test

+---------+-----------------------------------------------------------------------------------------+
| Table   | Create Table

                                                                    |
+---------+-----------------------------------------------------------------------------------------+
| product | CREATE TABLE `product` (
  `id` int NOT NULL,
  `name` varchar(20) DEFAULT NULL COMMENT '商品名称',
  `type` varchar(20) NOT NULL COMMENT '商品类型',
  PRIMARY KEY (`id`,`type`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
/*!50100 PARTITION BY KEY (`type`)
PARTITIONS 4 */ |
+---------+-----------------------------------------------------------------------------------------+
1 row in set (0.04 sec)

Méthode 2 : obtenir les détails de la partition en interrogeant information_schema.PARTITIONS

select PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS
FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA='test' AND TABLE_NAME='product';

Insérer la description de l'image ici

4.6. Interroger les données dans la partition spécifiée

Dans la figure ci-dessous, nous pouvons voir que les données de la table des produits se trouvent toutes dans les partitions p2 et p3.
Insérer la description de l'image ici
Interrogez les données dans une seule partition.

select * from product partition (p2) ;

Insérer la description de l'image ici
Notez que mysql5.5.41 ne prend pas en charge les requêtes sur les partitions spécifiées. Dans la version 5.6, les opérations associées sur les partitions des tables partitionnées ont été améliorées, y compris la prise en charge des requêtes sur les partitions spécifiées.

Interroger des données dans plusieurs partitions

select * from product partition (p2,p3) ;

Insérer la description de l'image ici
Partition et où requête combinée

select * from product partition (p2,p3)  where id in (1,6);

Insérer la description de l'image ici
Pour les tables avec partitions, les données de requête sont triées par partition par défaut.

CREATE TABLE `person` (
     `id` INT,
     `name` VARCHAR(50),
     `birthday` DATE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE( YEAR(birthday) ) (
     PARTITION p0 VALUES LESS THAN (1990),
     PARTITION p1 VALUES LESS THAN (1995),
     PARTITION p2 VALUES LESS THAN (2000)
);

INSERT INTO person VALUES
(1, 'lava', '1998-12-25'),
(2, 'admin', '1993-11-05'),
(3, '张三', '1996-03-10'),
(4, '李四', '1982-01-10'),
(5, '王五', '1984-09-16'),
(6, '赵六', '1987-06-05'),
(7, 'tony', '1992-08-04');

Comme indiqué ci-dessous : id=4,5,6 est la partition p0 ; id=2,7 est la partition p1, id=1,3 est la partition p2
Insérer la description de l'image ici

4.7. Ajouter une partition

-- range/list参考
alter table person add partition(PARTITION p6 VALUES LESS THAN (2020));

-- key/hash参考
alter table product add partition(PARTITION p6);
或者
alter table product add partition partitions 2;

注意:

  1. Seules les partitions de plage et de liste peuvent être supprimées, mais les partitions de clé et de hachage ne peuvent pas être supprimées. Veuillez faire attention lors de l'ajout d'une partition de clé/hachage.
  2. Pour les partitions de clé/hachage, l'ajout d'une nouvelle partition entraînera la répartition des données de la table précédente.
  3. Pour les tables partitionnées RANGE, les nouvelles partitions ne peuvent être ajoutées qu'en haut de la liste des partitions.
  4. Pour les tables partitionnées en LISTE, vous ne pouvez pas ajouter de valeurs déjà incluses dans la liste existante des valeurs de partition.

Cas 1 : Ajout de partitions par type de rang

CREATE TABLE `person` (
     `id` INT,
     `name` VARCHAR(50),
     `birthday` DATE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE( YEAR(birthday) ) (
     PARTITION p0 VALUES LESS THAN (1990),
     PARTITION p1 VALUES LESS THAN (1995),
     PARTITION p2 VALUES LESS THAN (2000)
);

INSERT INTO person VALUES
(1, 'lava', '1998-12-25'),
(2, 'admin', '1993-11-05'),
(3, '张三', '1996-03-10'),
(4, '李四', '1982-01-10'),
(5, '王五', '1984-09-16'),
(6, '赵六', '1987-06-05'),
(7, 'tony', '1992-08-04');
-- 新增分区   新增的分区数值只能比之前的更大
alter table person add partition (PARTITION p3 VALUES LESS THAN (2005));

4.8. Supprimer la partition

注意:
1.只支持删除range、 list分区 ,不支持删除key、 hash分区
2.删除分区后,分区内的数据也会被删除

# list/range删除分区
alter table person drop partition p3;

# key/hash不能通过drop删除分区,可以通过coalesce减少分区
语法:ALTER TABLE table_name COALESCE PARTITION num
示例:alter table product coalesce partition 2; -- 将原来的分区减少两个

4.9. Effacer les données de partition

# 清空某分区的数据
alter table person truncate partition p0;

4.10. Supprimez toutes les partitions mais conservez les données

Si vous souhaitez convertir une table partitionnée en table non partitionnée, vous pouvez supprimer toutes les partitions

# 格式
ALTER TABLE table_name remove partitioning;

# 样例
alter table person remove partitioning;

4.11. Redéfinir les partitions (diviser les partitions, fusionner les partitions, renommer)

Si vous souhaitez redéfinir la partition sans perdre de données, vous pouvez utiliser l'instruction suivante :

# 格式  range/list
alter table tbl_name reorganize partition partition_list into(partition_definitions)

# key/hash不能通过REORGANIZE合并分区,可以通过coalesce减少分区,达到合并分区的效果
语法:ALTER TABLE table_name COALESCE PARTITION num
示例:alter table product coalesce partition 2; -- 将原来的分区减少两个

# 样例:range/list  合并分区
ALTER TABLE tbl_name REORGANIZE PARTITION s0,s1 INTO(partition p0 values in(1,2,3,4,5));

#样例:range/list  拆分分区
alter table person reorganize partition p0,p1 into(partition s0 values less than(5),partition s1 values less than(10));
或者如:
alter table tbl_name reorganize partition p0 into(partition s0 values in(1,2,3), partition s1 values in(4,5));

Remarque : Si vous souhaitez diviser une partition, vous devez diviser toutes les données de la partition.
comme:

CREATE TABLE `person` (
     `id` INT,
     `name` VARCHAR(50),
     `birthday` DATE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE( YEAR(birthday) ) (
     PARTITION p0 VALUES LESS THAN (2005)
);
alter table person reorganize partition p0 into(
	partition s0 values less than(1995),
	partition s1 values less than(2005) --这里的数值必须跟p0分区的数值一致或者更大
);

4.12. Partitions utilisées lors des requêtes

Si la requête est basée sur une table partitionnée, les partitions auxquelles la requête accédera sont affichées. Dans les versions antérieures à 5.7, vous devez utiliser la commande expliquer les partitions pour afficher les partitions ; vous devez utiliser la commande expliquée étendue pour afficher les partitions filtrées. Après la version 5.7, expliquer affiche directement les informations dans les partitions et filtrées par défaut.

explain select * from product where type ='手机';

Insérer la description de l'image ici

4.13.Autres instructions de gestion des partitions

1. Reconstruire la partition : Semblable à la suppression d'abord de tous les enregistrements enregistrés dans la partition, puis à leur réinsertion, cela peut être utilisé pour défragmenter la partition. Par exemple : ALTER table nom_table REBUILD PARTITION p2,p3;

2. Optimiser le partitionnement : Si un grand nombre de lignes sont supprimées de la partition, ou si de nombreuses modifications sont apportées à une ligne de longueur variable (c'est-à-dire s'il existe des colonnes de type VARCHAR, BLOB ou TEXT), vous pouvez utiliser ALTER TABLE tbl_name OPTIMISER LA PARTITION pour récupérer l'espace inutilisé et défragmenter les fichiers de données de partition. Par exemple : ALTER TABLE nom_table OPTIMIZE PARTITION p2,p3;

À partir de mysql8.0, l'instruction ALTER TABLE … OPTIMIZE PARTITION n'est plus valide pour les tables partitionnées InnoDB. Utilisez plutôt l'instruction suivante :
ALTER TABLE … REBUILD PARTITION
ALTER TABLE … ANALYZE PARTITION

3. Analyser la partition : lisez et enregistrez la distribution des clés de la partition, telle que : ALTER TABLE tbl_name ANALYZE PARTITION p2,p3 ;

4. Vérifiez la partition : Vérifiez si les données ou l'index de la partition ont été endommagés, par exemple : ALTER TABLE tbl_name CHECK PARTITION p2, p3;

5. Réparer la partition : réparez la partition endommagée, telle que : ALTER TABLE tbl_name REPAIR PARTITION p2, p3 ;

5. Problèmes pouvant être rencontrés lors de l'utilisation de partitions

5.1、[HY000][1493] VALUES LESS THAN la valeur doit être strictement croissante pour chaque partition

Le contenu de l'erreur est le suivant :

[HY000][1493] VALUES LESS THAN value must be strictly increasing for each partition

Traduction : [HY000][1493] Pour chaque partition, les valeurs inférieures à la valeur doivent être strictement augmentées

Scénario d'erreur :
lors de l'ajout d'une nouvelle partition à la partition de plage, la valeur est inférieure à la valeur minimale précédente. Comme suit : Si je souhaite ajouter une autre partition entre 1995 et 2000, cette erreur sera signalée. La partition ajoutée doit être supérieure à 2000.

CREATE TABLE `person` (
     `id` INT,
     `name` VARCHAR(50),
     `birthday` DATE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
PARTITION BY RANGE( YEAR(birthday) ) (
     PARTITION p0 VALUES LESS THAN (1990),
     PARTITION p1 VALUES LESS THAN (1995),
     PARTITION p2 VALUES LESS THAN (2000)
);

mysql> alter table person add partition (PARTITION p3 VALUES LESS THAN (1998));
[HY000][1493] VALUES LESS THAN value must be strictly increasing for each partition

5.2、ERREUR 1512 (HY000) : DROP PARTITION ne peut être utilisé que sur les partitions RANGE/LIST

La suppression des tables partitionnées par clé et par hachage n'est pas prise en charge

create table if not exists product
(
	id int not null ,
	name varchar(20) null comment '商品名称',
	type varchar(20) not null comment '商品类型',
    primary key(id,type)
) partition by key(type) partitions 4; 

mysql> alter table product drop partition p1;
ERROR 1512 (HY000): DROP PARTITION can only be used on RANGE/LIST partitions

ERROR 1512 (HY000): DROP PARTITION can only be used on RANGE/LIST partitions

Article de référence :
https://www.cnblogs.com/wenxuehai/p/15901779.html#_label2_1Site
officiel Partitionnement https://dev.mysql.com/doc/refman/8.0/en/partitioning.htmlExplication
sur le partitionnement sur le site officiel site Internet C'est très détaillé et facile à visualiser. Pour plus d'informations, vous pouvez trouver des réponses sur le site officiel.

Je suppose que tu aimes

Origine blog.csdn.net/weixin_49114503/article/details/132050910
conseillé
Classement