Home  >  Article  >  Database  >  A brief analysis of code examples of MySQL-data table partitioning technology PARTITION

A brief analysis of code examples of MySQL-data table partitioning technology PARTITION

黄舟
黄舟Original
2017-03-11 14:34:461322browse

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. .

In Mysql 5.1 (later) there are several partition types:

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

Things that should be paid attention to when partitioning:

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   |
+-------------------+-------+

RANGE Partition

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
     -> );

List partition

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

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

Partition Management

Delete Partition

mysql> alter table employees drop partition pWest;

New partition

#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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn