Maison  >  Article  >  base de données  >  Explication détaillée des méthodes de partitionnement de base de données MySQL et de partitionnement de table et introduction au partitionnement et au partitionnement de table

Explication détaillée des méthodes de partitionnement de base de données MySQL et de partitionnement de table et introduction au partitionnement et au partitionnement de table

黄舟
黄舟original
2017-03-29 13:49:201687parcourir

Cet article présente principalement en détail les méthodes de partitionnement de base de données MySql et de partitionnement de table, vous indiquant ce que sont le partitionnement de table et le partitionnement, et quelle est la connexion entre le partitionnement de table MySQL et le partitionnement. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer

1 Pourquoi avons-nous besoin de diviser les tables et les partitions

Nous rencontrons souvent de gros problèmes dans le développement quotidien ? Dans le cas des tables, les grandes tables font référence à des tables qui stockent des millions, voire des dizaines de millions d'enregistrements. Une telle table est trop volumineuse, ce qui rend la base de données trop longue à interroger et à insérer, ce qui entraîne de faibles performances. Si une requête conjointe est impliquée, les performances seront encore pires. Le but du partitionnement de table et du partitionnement de table est de réduire la charge sur la base de données et d'améliorer l'efficacité de la base de données. De manière générale, il s'agit d'améliorer l'efficacité de l'ajout, de la suppression, de la modification et de l'interrogation des tables.

2. Que sont les sous-tables et les partitions

2.1 Sous-tables

Sous-tables -les tables sont Décomposer une grande table en plusieurs tables d'entités avec un espace de stockage indépendant selon certaines règles. Nous pouvons les appeler des sous-tables. Chaque table correspond à trois fichiers, un fichier de données MYD, un fichier d'index .MYI et un fichier de structure de table .frm. . Ces sous-tables peuvent être distribuées sur le même disque ou sur des machines différentes. Lorsque l'application lit et écrit, elle obtient le nom de sous-table correspondant selon les règles prédéfinies, puis l'exploite.

2.2 Partition

Le partitionnement est similaire au partitionnement de table, qui décompose les tables selon des règles. La différence est que le fractionnement de table décompose une grande table en plusieurs tables d'entités indépendantes, tandis que le partitionnement divise les données en segments et les stocke à plusieurs emplacements, qui peuvent se trouver sur le même disque ou sur des machines différentes. Après le partitionnement, il reste une table en surface, mais les données sont hachées vers plusieurs emplacements. Lorsque l'application lit et écrit, elle fonctionne toujours sur le nom de la grande table et la base de données organise automatiquement les données partitionnées.

L'objectif principal du partitionnement est de réduire la quantité totale de données lues et écrites dans une opération SQL spécifique afin de réduire le temps de réponse.

2.3 Quelle est la connexion entre les tables et les partitions MySQL ?

1), peut améliorer les performances de MySQL et avoir de bonnes performances dans un état de

haute concurrence . 2) La subdivision et le partitionnement des tables ne sont pas incohérents et peuvent coopérer les uns avec les autres. Pour les tables avec un volume d'accès important et des données de table relativement volumineuses, nous pouvons combiner la sous-table et le partitionnement. table Pour les tables contenant beaucoup de données, nous pouvons les partitionner.
3) La technologie des sous-tables est plus gênante. Vous devez créer manuellement des sous-tables. Le serveur d'application doit calculer les noms des sous-tables lors de la lecture et de l'écriture. Il est préférable d'utiliser la fusion, mais vous devez également créer une relation
union entre les sous-tables et configurer les sous-tables. 4) Par rapport aux sous-tables, le partitionnement des tables est facile à utiliser et ne nécessite pas la création de sous-tables.

3. Plusieurs façons de diviser les tables

3.1 cluster mysql

Il n'est pas une sous-table, mais elle joue le même rôle qu'une sous-table. Le cluster peut partager le nombre d'opérations de base de données et distribuer les tâches sur plusieurs bases de données. Le cluster peut séparer la lecture et l'écriture pour réduire la pression de lecture et d'écriture. Améliorant ainsi les performances de la base de données.

3.2 Division de table de règles personnalisée

Une grande table peut être décomposée en plusieurs sous-tables selon des règles métier. Il existe généralement les types suivants, vous pouvez également définir vos propres règles.

Plage (Plage) – Ce mode permet de diviser les données en différentes plages. Par exemple, une table peut être divisée en plusieurs partitions par année.
Hash (Hash) – Ce mode permet de calculer la clé de hachage d'une ou plusieurs colonnes de la table, et passe enfin cette partition de hachage à la zones de données correspondant à différentes valeurs de code. Par exemple, vous pouvez créer une table qui partitionne la clé primaire de la table.
Clé (valeur clé) – Une extension du mode de hachage ci-dessus, la clé de hachage ici est générée par le système MySQL.
Liste (liste prédéfinie) – Ce mode permet au système de diviser les données selon la valeur d'une liste prédéfinie.
Composite (mode composite) La combinaison des modes ci-dessus utilise le

règle de sous-table Comme pour les règles de partitionnement, elles sont décrites en détail dans le module de partitionnement.


Ce qui suit utilise Range pour présenter brièvement comment diviser le tableau (en fonction du tableau de l'année).

Supposons que la structure de la table comporte 4 champs : identifiant d'incrémentation automatique, nom, montant du dépôt, date du dépôt
Utilisez la date de dépôt comme règle pour diviser les tables et créer respectivement plusieurs tables
2011 : account_2011
2012 :account_2012
...
2015 : account_2015
L'application recherche le nom de la table correspondante en fonction de la date de lecture et d'écriture, et doit être déterminée manuellement.

var getTableName = function() {
  var data = {
    name: 'tom',
    money: 2800.00,
    date: '201410013059'
  };
  var tablename = 'account_';
  var year = parseInt(data.date.substring(0, 4));
  if (year < 2012) {
    tablename += 2011; // account_2011
  } else if (year < 2013) {
    tablename += 2012; // account_2012
  } else if (year < 2014) {
    tablename += 2013; // account_2013
  } else if (year < 2015) {
    tablename += 2014; // account_2014
  } else {
    tablename += 2015; // account_2015
  }
  return tablename;
}

3.3 Utiliser le moteur de stockage de fusion pour implémenter des sous-tables

les sous-tables de fusion sont divisées en tables principales et sous- tables. La table principale est similaire. C'est un shell qui encapsule logiquement la sous-table. En fait, les données sont stockées dans la sous-table.

Nous pouvons insérer et interroger des données via la table principale. Si nous connaissons les règles des sous-tables, nous pouvons également exploiter directement les sous-tables.

Sous-tableau 2011

CREATE TABLE `account_2011` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`money` float NOT NULL ,
`tradeDate` datetime NOT NULL
PRIMARY KEY (`id`)
)
ENGINE=MyISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=2
CHECKSUM=0
ROW_FORMAT=DYNAMIC
DELAY_KEY_WRITE=0
;

Sous-tableau 2012

CREATE TABLE `account_2012` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`money` float NOT NULL ,
`tradeDate` datetime NOT NULL
PRIMARY KEY (`id`)
)
ENGINE=MyISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
AUTO_INCREMENT=2
CHECKSUM=0
ROW_FORMAT=DYNAMIC
DELAY_KEY_WRITE=0
;

Tableau principal, toutes les années

CREATE TABLE `account_all` (
`id` int(11) NOT NULL AUTO_INCREMENT ,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
`money` float NOT NULL ,
`tradeDate` datetime NOT NULL
PRIMARY KEY (`id`)
)
ENGINE=MRG_MYISAM
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
UNION=(`account_2011`,`account_2012`)
INSERT_METHOD=LAST
ROW_FORMAT=DYNAMIC
;

Créer le tableau principal Parfois là est un INSERT_METHOD, indiquant la méthode d'insertion. La valeur peut être : 0 n'autorise pas l'insertion dans la première table de UNION ;

Lors d'une interrogation via la table principale, cela équivaut à interroger toutes les sous-tables ensemble. Cela ne reflète pas les avantages des sous-tables. Il est recommandé d'interroger les sous-tables.

4. Plusieurs façons de partitionner

4.1 Gamme

create table range( 
  id int(11), 
  money int(11) unsigned not null, 
  date datetime 
  )partition by range(year(date))( 
  partition p2007 values less than (2008), 
  partition p2008 values less than (2009), 
  partition p2009 values less than (2010) 
  partition p2010 values less than maxvalue 
);

4.2 Liste

create table list( 
  a int(11), 
  b int(11) 
  )(partition by list (b) 
  partition p0 values in (1,3,5,7,9), 
  partition p1 values in (2,4,6,8,0) 
 );

4.3 Hachage

create table hash( 
  a int(11), 
  b datetime 
  )partition by hash (YEAR(b) 
  partitions 4;

4.4 clé

create table t_key( 
  a int(11), 
  b datetime) 
  partition by key (b) 
  partitions 4;

4.5 Gestion des partitions

4.5.1 Nouvelle partition

ALTER TABLE sale_data
ADD PARTITION (PARTITION p201010 VALUES LESS THAN (201011));

4.5.2 Supprimer la partition

Lorsqu'une partition est supprimée, toutes les données de la partition sont également supprimées.

ALTER TABLE sale_data DROP PARTITION p201010;

4.5.3 Fusionner les partitions

Le SQL suivant fusionne p201001 - p201009 en 3 partitions p2010Q1 - p2010Q3

ALTER TABLE sale_data
REORGANIZE PARTITION p201001,p201002,p201003,
p201004,p201005,p201006,
p201007,p201008,p201009 INTO
(
PARTITION p2010Q1 VALUES LESS THAN (201004),
PARTITION p2010Q2 VALUES LESS THAN (201007),
PARTITION p2010Q3 VALUES LESS THAN (201010)
);

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn