Als ich vorher die Trennwand sah, habe ich sie gekniffen, sie war so hoch. Gestern habe ich endlich gelernt, was Partitionierung ist, aber mehr ist es nicht. Um es heute zusammenzufassen: Ein gutes Gedächtnis ist nicht so gut wie ein schlechtes Schreiben.
MySQL unterstützt die Partitionierungsfunktion ab 5.1. Ein Satz zur Partitionierung lautet: 把一张表按照某种规则(range/list/hash/key等)分成多个区域(页/文件)保存。
Für die MySQL-Anwendungsentwicklung gibt es keinen Unterschied zwischen Partitionierung und Nichtpartitionierung (dh sie ist für die Anwendung transparent). Es ist, als würde man es in einem Breakout-Kampf „in Stücke brechen“. MySQL unterstützt die meisten Speicher-Engines (wie MyISAM, InnoDB, Memory usw.) zum Erstellen von Partitionen, unterstützt jedoch nicht MERGE und CSV zum Erstellen von Partitionen. Alle Partitionen in derselben Partitionstabelle müssen derselben Speicher-Engine angehören. Machen Sie ein Beispiel:
#创建一个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;
Kann mehr Daten speichern (maximale Grenze einer einzelnen Datei im System)
Optimieren Sie die Abfrage in der Where-Klausel, wenn die Partitionsbedingung lautet enthalten, nur eine oder einen Teil einer Partition scannen, um die Abfrageeffizienz zu verbessern. Wenn es um Funktionen wie sum() geht, kann diese parallel auf den Partitionen abgearbeitet werden und die Ergebnisse schließlich zusammengefasst werden.
Für abgelaufene oder unnötige Daten können Sie zugehörige Partitionen löschen, um Daten schnell zu löschen.
Durch die Verteilung von Datenabfragen auf mehrere Festplatten wird die Parallelitätsfähigkeit einer einzelnen Tabelle verbessert und auch die Festplatten-E/A-Leistung wird verbessert.
ist in 4 Typen unterteilt:
Bereichspartition: basierend auf a gegeben Der kontinuierliche Intervallbereich der Daten wird verschiedenen Partitionen zugeordnet.
Listenpartitionierung: Ähnlich wie bei der Bereichspartitionierung besteht der Unterschied darin, dass die Liste basierend auf der Aufzählungswertliste und der Bereich basierend auf dem Bereich partitioniert wird.
Hash-Partition: Ordnen Sie Daten basierend auf der angegebenen Anzahl von Partitionen verschiedenen Partitionen zu (modulo/linear)
Schlüsselpartition: Ähnlich wie Hash-Partitionierung.
Bei der Bereichs-, Listen- und Hash-Partitionierung in MySQL 5.1 muss der Partitionsschlüssel int sein. MySQL 5.5 und höher unterstützt nicht ganzzahlige Bereichs- und Listenpartitionen, nämlich Bereichsspalten und Listenspalten.
Hinweis: Unabhängig von der Art der Partitionierung gibt es entweder keinen Primärschlüssel/eindeutigen Schlüssel in der Partitionstabelle, oder einer der Partitionsschlüssel muss ein Primärschlüssel/eindeutiger Schlüssel sein.
Bereichspartitionierung verwendet Wertebereiche (Intervalle), um Partitionen zu unterteilen. Die Intervalle müssen kontinuierlich sein und dürfen sich nicht überlappen . Mit values less than
Operator wird die Partitionsdefinition durchgeführt.
Beispiel 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 );
Im obigen Beispiel ist eine Bereichspartitionstabelle mit 3 Partitionen (t21, t22, t23) definiert Es ähnelt in gewisser Weise der switch-Anweisung 这个有点类似与高级语言中的<a href="//m.sbmmt.com/code/5745.html" target="_blank">switch语句</a>
in Hochsprachen. Die Erklärung lautet wie folgt: Wenn id<10, befindet es sich in der t21-Partition; wenn 20>id>=10, befindet es sich in der t22-Partition;
Beispiel 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 verbessert die Bereichspartitionierung und bietet Bereichsspaltenpartitionierung zur Unterstützung der nicht-ganzzahligen Partitionierung.
Listenpartition erstellt eine diskrete Werteliste (ähnlich den Aufzählungstypdaten in MySQL) zum Partitionieren. Verwenden Sie zum Partitionieren den values in
-Operator . Listenpartitionen müssen nicht in einer bestimmten Reihenfolge deklariert werden. Listen ähneln in vielerlei Hinsicht Bereichen.
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) );
Das obige Beispiel ist: Wenn die ID 1 oder 2 ist, wird sie in t41 partitioniert; wenn die ID 3 oder 6 ist, wird sie in t42 partitioniert und so weiter...
Hash-Partition wird hauptsächlich zur Verteilung von Hotspot-Lesevorgängen verwendet, um sicherzustellen, dass Daten so gleichmäßig wie möglich auf eine vorgegebene Anzahl von Partitionen verteilt werden. Wenn eine Tabelle eine Hash-Partitionierung durchführt, wendet MySQL eine Hash-Funktion auf den Partitionsschlüssel an, um zu bestimmen, in welcher der n Partitionen die Daten abgelegt werden sollen. Die Hash-Partition unterstützt zwei Hash-Funktionen (Partitionierungsmethoden): 取模算法(默认hash分区方式)
und 线性的2的幂的运算法则(liner hash 分区)
.
#顶部引例就是常规hash分区
MySQL empfiehlt nicht die Verwendung von Hash--Ausdrücken mit mehreren Spalten.
Herkömmliches Hashing verursacht zu hohe Kosten bei der Partitionsverwaltung und ist nicht für die Anforderungen flexibler Partitionen geeignet. Siehe: Konsistenter Hash-Algorithmus
Aufgrund der Verwaltungsprobleme der herkömmlichen Hash-Partitionierung führt alle MySQL eine lineare Hash-Partitionierung ein.
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;
Im obigen Beispiel wird eine lineare Hash-Partition mit 5 Partitionen erstellt.
Vorteile der linearen Hash-Partitionierung: MySQL kann die Partitionswartung schneller durchführen
线性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. 数据库设计那些事
Das obige ist der detaillierte Inhalt vonDetaillierte Einführung in Partitionen in MySQL. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!