This article mainly introduces a brief analysis of Mysql data table partitioning technology PARTITION, and introduces the partitioning technologies RANGE, LIST, and HASH in Mysql respectively. Friends in need can refer to it.
In this chapter, let’s learn about the partitioning technology (RANGE, LIST, HASH) in Mysql
Mysql’s partitioning technology is somewhat similar to horizontal table partitioning, but it is based on The horizontal table partitioning performed by the logical layer is still a table for the application. In other words: partitioning does not actually split a table. After partitioning, the table is still a table. It splits the storage files. .
RANGE partitioning: assign multiple rows to partitions based on column values belonging to a given continuous range
LIST partitioning: similar to partitioning by RANGE, the difference is that LIST partitioning is based on the column value matching a value in a discrete value set to select
HASH partitioning: based on the return value of a user-defined expression To select partitioning, this expression is calculated using the column values of the rows to be inserted into the table. This function can contain any expression valid in Mysql that produces a non-negative integer value
KEY partitioning: Compared with partitioning by HASH, the difference is that KEY partition only supports calculation of one or more columns, and the Mysql server provides its own hash function
1. When doing partitioning, either do not define the primary key, or add the partition field to the primary key
2. The partition field cannot be NULL, otherwise how to determine the partition range, so try to NOT NULL
First you can check Check whether your Mysql version supports PARTITION
mysql> show plugins; | partition | ACTIVE | STORAGE ENGINE | NULL | GPL |
or:
mysql> show variables like "%part%"; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | have_partitioning | YES | +-------------------+-------+
Assume that you create a table as follows, which saves There are employee records of 20 video stores. These 20 video stores are numbered from 1 to 20. If you want to divide it into 4 small partitions, then you can use RANGE partition. The created database table is as follows:
mysql-> 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 NOT NULL, -> store_id INT NOT NULL -> ) ENGINE=Myisam DEFAULT CHARSET=utf8 -> PARTITION BY RANGE (store_id) ( -> PARTITION P0 VALUES LESS THAN (6), -> PARTITION P1 VALUES LESS THAN (11), -> PARTITION P2 VALUES LESS THAN (16), -> PARTITION P3 VALUES LESS THAN (21) -> );
If you want to store employees who resigned in different periods separately, then you can use the date field separated (i.e. separation time) as a key, the created SQL statement is as follows:
mysql-> 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 NOT NULL, -> store_id INT NOT NULL -> ) ENGINE=Myisam DEFAULT CHARSET=utf8 -> PARTITION BY RANGE (YEAR(separated)) ( -> PARTITION P0 VALUES LESS THAN (2001), -> PARTITION P1 VALUES LESS THAN (2011), -> PARTITION P2 VALUES LESS THAN (2021), -> PARTITION P3 VALUES LESS THAN MAXVALUE -> );
Same example, if these 20 video stores Distributed in 4 regions with distribution rights,
+------------------+--------------------------------------+ | 地区 | 音像店 ID 号 | +------------------+--------------------------------------+ | 北区 | 3, 5, 6, 9, 17 | | 东区 | 1, 2, 10, 11, 19, 20 | | 西区 | 4, 12, 13, 14, 18 | | 中心区 | 7, 8, 15, 16 | +------------------+--------------------------------------+ mysql-> 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 NOT NULL, -> store_id INT NOT NULL -> ) ENGINE=Myisam DEFAULT CHARSET=utf8 -> 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) -> );
After you create it, you can enter the Mysql data storage file. The folder location is defined in the Mysql configuration file
shawn@Shawn:~$ sudo vi /etc/mysql/my.cnf; [mysqld] datadir = /var/lib/mysql shawn@Shawn:~$ cd /var/lib/mysql/dbName shawn@Shawn:/var/lib/mysql/dbName$ ll 显示如下: 8768 Jun 7 22:01 employees.frm 48 Jun 7 22:01 employees.par 0 Jun 7 22:01 employees#P#pCentral.MYD 1024 Jun 7 22:01 employees#P#pCentral.MYI 0 Jun 7 22:01 employees#P#pEast.MYD 1024 Jun 7 22:01 employees#P#pEast.MYI 0 Jun 7 22:01 employees#P#pNorth.MYD 1024 Jun 7 22:01 employees#P#pNorth.MYI 0 Jun 7 22:01 employees#P#pWest.MYD 1024 Jun 7 22:01 employees#P#pWest.MYI
As you can see from here, it splits the storage files according to our definition
employees.frm = 表结构 employees.par = partition, 申明是一个分区表 .MYD = 数据文件 .MYI = 索引文件
HASH partition main Used to ensure that data is evenly distributed among a predetermined number of partitions
If you want to store employees who joined in different periods separately, then you can use the date field hired as a key
mysql-> 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 NOT NULL, -> store_id INT NOT NULL -> ) ENGINE=Myisam DEFAULT CHARSET=utf8 -> PARTITION BY HASH (YEAR(hired)) ( -> PARTITIONS 4 -> ); #这里注意的是 PARTITIONS, 多了一个 s
Here It should be mentioned that the above examples all use the Myisam storage engine, which uses independent table spaces by default, so you can see different partitions in the disk space above
while the InnoDB engine uses shared tables by default Space, at this time, even if you partition the InnoDB table, you will find that it is not physically partitioned like Myisam, so you need to modify the Mysql configuration file:
shawn@Shawn:~$ sudo vi /etc/mysql/my.cnf; #添加: innodb_file_per_table=1 #重启 mysql shawn@Shawn:~$ sudo /etc/init.d/mysql restart
At this time, if you partition InooDB, the following effects will occur:
8768 Jun 7 22:54 employees.frm 48 Jun 7 22:54 employees.par 98304 Jun 7 22:54 employees#P#pCentral.ibd 98304 Jun 7 22:54 employees#P#pEast.ibd 98304 Jun 7 22:54 employees#P#pNorth.ibd 98304 Jun 7 22:54 employees#P#pWest.ibd
mysql> alter table employees drop partition pWest;
#range添加新分区 mysql> alter table employees add partition ( partition p4 values less than (26) ); #list添加新分区 mysql> alter table employees add partition( partition pSouth values in (21, 22, 23) ); #hash重新分区 mysql> alter table employees add partition partitions 5;
The above is the detailed content of A brief analysis of code examples of MySQL-data table partitioning technology PARTITION. For more information, please follow other related articles on the PHP Chinese website!