Avec le développement d'Internet, il y a de plus en plus de données sous tous leurs aspects, comme en témoigne l'appel croissant pour le big data au cours des deux dernières années.
Bien que le projet que nous réalisons ne soit pas de grande envergure, en raison du volume d'affaires, il y a beaucoup de données.
Lorsqu'il y a trop de données, des problèmes de performances sont susceptibles de survenir. Pour résoudre ce problème, nous pensons généralement facilement au clustering, au sharding, etc.
Mais à un moment donné, il n'est pas nécessaire d'utiliser des clusters ou du sharding, et le partitionnement des données peut également être utilisé de manière appropriée.
Qu'est-ce qu'une cloison ?
Lorsque MySQL n'active pas la fonction de partition, le contenu d'une seule table de la base de données est stocké sur le système de fichiers sous la forme d'un seul fichier. Lorsque la fonction de partitionnement est activée, MySQL divisera le contenu d'une seule table en plusieurs fichiers et les stockera sur le système de fichiers selon les règles spécifiées par l'utilisateur. Le partitionnement est divisé en partitionnement horizontal et partitionnement vertical. Le partitionnement horizontal divise les données du tableau en différents fichiers de données par lignes, tandis que le partitionnement vertical divise les données du tableau en différents fichiers de données par colonnes. Le partage doit suivre les principes d’exhaustivité, de reconfigurabilité et de disjonction. L'exhaustivité signifie que toutes les données doivent être mappées sur un fragment. La reconfigurabilité signifie que toutes les données fragmentées doivent pouvoir être reconstruites en données globales. La disjonction signifie qu'il n'y a pas de duplication de données sur différentes partitions (sauf si vous les rendez délibérément redondantes).
Probablement en raison de diverses considérations, la table que nous avons utilisée utilise le partitionnement par plage. La base de données est gérée par d'autres, mais comme cette table est utilisée, j'ai pris le temps de le faire.
Pour autant que je sache, si vous souhaitez utiliser le partitionnement, vous devez utiliser l'instruction pour créer une partition lors de la création de la structure de la table, et elle ne peut pas être modifiée ultérieurement.
Par exemple, je crée une table emp simple avec trois champs : identifiant, nom et âge, puis je la partitionne en fonction de l'identifiant. L'instruction correcte de création de table est essentiellement la suivante :
CREATE TABLE emp( id INT NOT NULL, NAME VARCHAR(20), age INT) PARTITION BY RANGE(ID)( PARTITION p0 VALUES LESS THAN (6), PARTITION p1 VALUES LESS THAN (11), PARTITION pmax VALUES LESS THAN maxvalue );
Ici, je définis les données de la table entière à diviser en trois zones. La zone avec un identifiant inférieur à 6 est une zone, et la zone. le nom est p0 ; l'identifiant est compris entre 6 et 11. appartient à une zone, le nom de la zone est p1 alors toutes les zones avec un identifiant supérieur à 11 ont un nom de zone pmax ;
Organisez une syntaxe, essentiellement comme suit :
create table tablename( 字段名 数据类型...) partition by range(分区依赖的字段名)( partition 分取名 values less than (分区条件的值),...)
Ce qu'il faut noter ici, c'est que la dernière ligne de l'exemple, partitionne les valeurs pmax inférieures à maxvalue, dans cette phrase uniquement pmax, qui représente le nom de la partition, peut être obtenu arbitrairement, les mots restants ne peuvent pas être modifiés et maxvalue représente la valeur maximale de la condition de partitionnement ci-dessus.
Cela garantira que toutes les données peuvent être stockées normalement dans la base de données. Sinon, s'il n'y a pas de phrase de ce type, les données avec un identifiant supérieur ou égal à 11 ne seront pas stockées dans la base de données et une erreur sera signalée.
Après la création de la structure de la table, afin de tester si le partitionnement a réussi, j'ai inséré quelques données dans la table. L'instruction est la suivante :
INSERT INTO emp VALUES(1,'test1',22);INSERT INTO emp VALUES(2,'test2',25);INSERT INTO emp VALUES(3,'test3',27); INSERT INTO emp VALUES(4,'test4',20);INSERT INTO emp VALUES(5,'test5',22);INSERT INTO emp VALUES(6,'test6',25); INSERT INTO emp VALUES(7,'test7',27);INSERT INTO emp VALUES(8,'test8',20);INSERT INTO emp VALUES(9,'test9',22); INSERT INTO emp VALUES(10,'test10',25);INSERT INTO emp VALUES(11,'test11',27);INSERT INTO emp VALUES(12,'test12',20); INSERT INTO emp VALUES(13,'test13',22);INSERT INTO emp VALUES(14,'test14',25);INSERT INTO emp VALUES(15,'test15',27); INSERT INTO emp VALUES(16,'test16',20);INSERT INTO emp VALUES(17,'test17',30);INSERT INTO emp VALUES(18,'test18',40); INSERT INTO emp VALUES(19,'test19',20);
Après l'insertion des données. est terminé, vérifiez si cela correspond à l'identifiant. Les données sont enregistrées dans la partition correspondante. Vous pouvez utiliser la commande pour interroger la partition, comme suit :
SELECT partition_name,partition_expression,partition_description,table_rows FROM information_schema.PARTITIONS WHERE table_schema = SCHEMA() AND table_name='emp'
Le résultat de la requête est tel qu'indiqué dans la figure. :
On peut voir que partition_name est le nom de la partition est le champ dont dépend la partition, partition_description peut être compris comme la condition de la partition et table_rows représente la quantité de données actuellement. dans la partition.
Les données ci-dessus montrent que le partitionnement est réussi. Cependant, bien que le partitionnement ci-dessus puisse éviter le problème de l'impossibilité d'être inséré, un nouveau problème est apparu.
C'est-à-dire que les données dans la dernière zone pmax peuvent être très volumineuses. Par conséquent, les données sont inégales et disproportionnées, ce qui peut entraîner des problèmes de performances lors de l'interrogation des données dans la dernière zone. Par conséquent, il existe environ trois solutions :
Premièrement, si vous pouvez contrôler les données du champ de partition, comme l'identifiant ici, si vous pouvez clairement savoir quand et quelle valeur ce sera, alors vous ne pouvez pas utilisez ce pmax au début, mais ajoutez régulièrement des partitions. Par exemple, si p0 et p1 existent ici, vous pouvez ajouter p2, p3 ou même plus lorsque l'identifiant est sur le point d'atteindre 11. Des exemples d'instructions pour ajouter des partitions sont les suivants :
ALTER TABLE emp ADD PARTITION(PARTITION p2 VALUES LESS THAN (16))
La syntaxe est :
alter table tablename add partition(partition 分区名 values lessthan (分区条件))
La méthode ci-dessus peut résoudre le problème des données disproportionnées, mais elle présente également des dangers cachés, c'est-à-dire que si vous oubliez d'ajouter des partitions ultérieures, ou si les valeurs des champs dont dépendent les partitions dépassent les attentes, cela peut entraîner le problème que les données ne peuvent pas être stockées dans la base de données. De cette façon, il existe deux façons de résoudre le problème :
Tout d'abord, vous pouvez utiliser le mécanisme de transaction et les procédures stockées de MySQL pour créer une tâche planifiée MySQL, puis demander au système de base de données d'ajouter des partitions à un moment précis. De cette façon, les problèmes mentionnés dans la première méthode ne se produiront fondamentalement pas, mais cette méthode nécessite une certaine compréhension des transactions MySQL et des procédures stockées, et elle est difficile à utiliser.
Je connais cette méthode, mais je ne l'ai pas encore implémentée. Je donnerai des exemples pertinents plus tard après en avoir appris davantage sur les transactions et les procédures stockées.
En plus de la méthode de tâche planifiée ci-dessus, il existe une autre façon de diviser la partition, c'est-à-dire d'utiliser la structure de table qui avait la partition pmax auparavant, puis d'utiliser l'instruction split partition pour la diviser pmax. Un exemple est le suivant :
ALTER TABLE emp REORGANIZE PARTITION pmax INTO( PARTITION p2 VALUES LESS THAN (16), PARTITION pmax VALUES LESS THAN maxvalue )
然后我们再用查询分区情况的语句查询,便可以看到结果变成这样:
很显然,多出来了一个p2分区,拆分成功的同事不影响其他的功能。
那么这里分区拆分的语法整理如下:
alter table tablename reorganize partition 要拆分的分区名 into( partition 拆分后的分区名1 values less than (条件), partition 拆分后的分区名2 values lessthan (条件),...)
好了,到这里基本上算是完成了,但是我们知道数据库一般的操作都是增删改查,我们这里已经有了增改查,却自然也不能少了删。
按理说正常的生产环境的数据库应该是不能随意删除数据的,但是并不代表就不能删,反而有的时候还必须要删。
就比如我们项目中那个库,由于数据量太大,即便是分区了也依旧会在大量数据的情况下变慢。而与此同时,我们是按时间分区的,实际使用过程中只需要用到几天的数据,那么实际上很早以前的数据是可以删除不要的,或者说备份以后删除这个表的,这样就需要用到删除语句。
当然了,删除可以用delete,但是这样的话分区信息还在库中,实际上也是没必要要的,完全可以直接删除分区,因为删除分区的时候也同时会删除这个区内的所有数据。
示例之前我们先查一下之前插入的所有数据,如图:
这里示例删除p0分区代码如下:
ALTER TABLE emp DROP PARTITION p0
然后先用查询分区的代码看一下,如图
可以看到p0区不见了,在select * 一下,如图:
可以看到id小于6的数据已经没有了,数据删除成功。
以上就是mysql分区之range分区的详细介绍的内容,更多相关内容请关注PHP中文网(www.php.cn)!