MySQL unterstützt die Partitionierungsfunktion ab Version 5.1. In MySQL 5.1 muss der Partitionsausdruck eine Ganzzahl sein oder ein Ausdruck, der eine Ganzzahl zurückgibt, während MySQL 5.5 Unterstützung für die Partitionierung von nicht ganzzahligen Ausdrücken bietet. Die Partition der MySQL-Datenbank ist ein lokaler Partitionsindex. Eine Partition speichert sowohl Daten als auch Indizes. Das heißt, der Clustered-Index und der Nicht-Clustered-Index jeder Zone werden in ihren jeweiligen Zonen (verschiedenen physischen Dateien) platziert. MySQL unterstützt 4 Partitionstypen: RANGE-Partition, LIST-Partition, HASH-Partition und KEY-Partition.
Die Betriebsumgebung dieses Tutorials: Windows7-System, MySQL8-Version, Dell G3-Computer.
MySQL unterstützt Partitionierung.
MySQL hat in 5.1 Unterstützung für die horizontale Partitionierung hinzugefügt. Unter Partitionierung versteht man die Aufteilung einer Tabelle oder eines Index in kleinere, besser verwaltbare Teile. Jede Zone ist unabhängig und kann unabhängig oder als Teil eines größeren Objekts verarbeitet werden. Dies ist eine von MySQL unterstützte Funktion und der Geschäftscode muss nicht geändert werden. Sie müssen wissen, dass es sich bei MySQL im Gegensatz zu anderen Datenbanken wie TIDB um OLTP-orientierte Daten handelt. Dann sollten Sie bei der Verwendung von Partitionen sehr vorsichtig sein. Wenn Sie nicht wissen, wie man Partitionen verwendet, kann dies negative Auswirkungen auf die Leistung haben.
Die Partition der MySQL-Datenbank ist ein lokaler Partitionsindex. Eine Partition speichert sowohl Daten als auch einen Index. Mit anderen Worten: Der Clustered-Index und der Nicht-Clustered-Index jeder Zone werden in ihren jeweiligen Zonen (verschiedenen physischen Dateien) platziert. Derzeit unterstützt die MySQL-Datenbank keine globale Partitionierung.
Unabhängig von der Art der Partitionierung muss die Partitionierungsspalte eine Komponente des eindeutigen Index sein, wenn die Tabelle einen Primärschlüssel oder einen eindeutigen Index enthält.
Begrenzende Faktoren der Partitionstabelle
(1) Eine Tabelle kann nur maximal 1024 Partitionen haben.
(2). In MySQL5.1 muss der Partitionsausdruck eine Ganzzahl sein oder ein Ausdruck, der eine Ganzzahl zurückgibt. Unterstützung für die Partitionierung nicht-ganzzahliger Ausdrücke wird in MySQL 5.5 bereitgestellt.
(3) Wenn das Partitionsfeld Primärschlüsselspalten oder eindeutige Indexspalten enthält, müssen viele Primärschlüsselspalten und eindeutige Indexspalten enthalten sein. Das heißt: Das Partitionsfeld enthält entweder nicht den Primärschlüssel oder die Indexspalte oder alle Primärschlüssel- und Indexspalten.
(4). Fremdschlüsseleinschränkungen können in partitionierten Tabellen nicht verwendet werden.
(5) Die MySQL-Partitionierung gilt für alle Daten und Indizes in einer Tabelle. Sie können nicht nur die Tabellendaten, aber nicht den Index partitionieren, Sie können nicht nur den Index, aber nicht die Tabelle partitionieren, und Sie können nicht nur einen Teil der Daten partitionieren des Tisches.
Derzeit unterstützt MySQL verschiedene Arten von Partitionen: RANGE-Partition, LIST-Partition, HASH-Partition und KEY-Partition. Wenn die Tabelle einen Primärschlüssel oder einen eindeutigen Index hat, muss die Partitionsspalte Bestandteil des eindeutigen Index sein. Im tatsächlichen Kampf wird höchstwahrscheinlich die RANGE-Partitionierung verwendet.
RANGE-Partitionierung ist der in der Praxis am häufigsten verwendete Partitionierungstyp. Zeilendaten werden basierend auf Spaltenwerten, die zu einem bestimmten kontinuierlichen Intervall gehören, in Partitionen platziert. Denken Sie jedoch daran, dass eine Ausnahme ausgelöst wird, wenn die eingefügten Daten keinen in einer Partition definierten Wert haben.
RANGE-Partition wird hauptsächlich für die Partitionierung von Datumsspalten verwendet, z. B. Transaktionstabellen, Verkaufstabellen usw. Die Daten können nach Jahr und Monat gespeichert werden. Wenn Sie Datumstypdaten im eindeutigen Index partitionieren, beachten Sie bitte, dass der Optimierer nur Funktionen wie YEAR(), TO_DAYS(), TO_SECONDS() und UNIX_TIMESTAMP() optimieren kann. Im tatsächlichen Kampf kann der Typ int verwendet werden, also speichern Sie einfach yyyyMM. Sie müssen sich keine Gedanken mehr über Funktionen machen.
CREATE TABLE `m_test_db`.`Order` ( `id` INT NOT NULL AUTO_INCREMENT, `partition_key` INT NOT NULL, `amt` DECIMAL(5) NULL, PRIMARY KEY (`id` , `partition_key`) ) PARTITION BY RANGE (partition_key) PARTITIONS 5 ( PARTITION part0 VALUES LESS THAN (201901) , PARTITION part1 VALUES LESS THAN (201902) , PARTITION part2 VALUES LESS THAN (201903) , PARTITION part3 VALUES LESS THAN (201904) , PARTITION part4 VALUES LESS THAN (201905));
Zu diesem Zeitpunkt fügen wir zuerst einige Daten ein
INSERT INTO `m_test_db`.`Order` (`id`, `partition_key`, `amt`) VALUES ('1', '201901', '1000'); INSERT INTO `m_test_db`.`Order` (`id`, `partition_key`, `amt`) VALUES ('2', '201902', '800'); INSERT INTO `m_test_db`.`Order` (`id`, `partition_key`, `amt`) VALUES ('3', '201903', '1200');
Jetzt fragen wir ab und stellen über den Befehl EXPLAIN PARTITION fest, dass der SQL-Optimierer nur den entsprechenden Bereich durchsucht und nicht alle Partitionen durchsucht
Wenn es ein Problem mit gibt die SQL-Anweisung, dann Kann alle Bereiche besuchen. Es wäre gefährlich. Daher muss die SELECT-Anweisung nach der Partitionierung der Tabelle den Partitionsschlüssel verwenden.
Die folgenden 3 Typen werden nicht allzu häufig verwendet, daher werde ich sie hier nur erwähnen.
LIST-Partitionierung ist der RANGE-Partitionierung sehr ähnlich, mit der Ausnahme, dass die Werte der Partitionierungsspalte diskret und nicht kontinuierlich sind. Die LIST-Partitionierung verwendet VALUES IN, da der Wert jeder Partition diskret ist und daher nur Werte definiert werden können.
Apropos Hashing: Der Zweck liegt auf der Hand: Daten gleichmäßig auf vordefinierte Partitionen zu verteilen, um sicherzustellen, dass die Anzahl jeder Partition ungefähr gleich ist.
KEY-Partition ähnelt der HASH-Partition. Der Unterschied besteht darin, dass die HASH-Partition benutzerdefinierte Funktionen zur Partitionierung verwendet und die KEY-Partition von der Datenbank bereitgestellte Funktionen zur Partitionierung verwendet.
一项技术,不是用了就一定带来益处。比如显式锁功能比内置锁强大,你没玩好可能导致很不好的情况。分区也是一样,不是启动了分区数据库就会运行的更快,分区可能会给某些sql语句性能提高,但是分区主要用于数据库高可用性的管理。
数据库应用分为2类,一类是OLTP(在线事务处理),一类是OLAP(在线分析处理)。对于OLAP应用分区的确可以很好的提高查询性能,因为一般分析都需要返回大量的数据,如果按时间分区,比如一个月用户行为等数据,则只需扫描响应的分区即可。在OLTP应用中,分区更加要小心,通常不会获取一张大表的10%的数据,大部分是通过索引返回几条数据即可。
比如一张表1000w数据量,如果一句select语句走辅助索引,但是没有走分区键。那么结果会很尴尬。如果1000w的B+树的高度是3,现在有10个分区。那么不是要(3+3)*10次的逻辑IO?(3次聚集索引,3次辅助索引,10个分区)。所以在OLTP应用中请小心使用分区表。
在日常开发中,如果想查看sql语句的分区查询结果可以使用explain partitions + select sql来获取,partitions标识走了哪几个分区。
mysql> explain partitions select * from TxnList where startTime>'2016-08-25 00:00:00' and startTime<'2016-08-25 23:59:00'; +----+-------------+-------------------+------------+------+---------------+------+---------+------+-------+-------------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------------------+------------+------+---------------+------+---------+------+-------+-------------+ | 1 | SIMPLE | ClientActionTrack | p20160825 | ALL | NULL | NULL | NULL | NULL | 33868 | Using where | +----+-------------+-------------------+------------+------+---------------+------+---------+------+-------+-------------+ 1 row in set (0.00 sec)
注:
1.MySQL Workbench下添加分区的截图
2. Table has no partition for value 12
在12月的某一天,我查看了生产的日志文件,忽然发现系统一直在报错:Table has no partition for value 12。仔细检查分区sql发现分区的时候用的是less than
也就是说我在注释1截图里面的分区是不包括12月的区的。执行以下命令增加分区:
ALTER TABLE table_name ADD PARTITION (PARTITION p_12 VALUES LESS THAN (13));
如果没有进行适当的处理,将会报错。所以在进行 RANGE 分区时,要思考这种情况。一般情况下,就时在最后添加一个 MAXVALUE 分区,如下:
PARTITION p_max VALUES LESS THAN MAXVALUE
【相关推荐:mysql视频教程】
Das obige ist der detaillierte Inhalt vonUnterstützt MySQL die Partitionierung?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!