前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL表分区技术详细介绍

MySQL表分区技术详细介绍

作者头像
九州暮云
发布2019-08-21 11:53:23
1.1K0
发布2019-08-21 11:53:23
举报
文章被收录于专栏:九州牧云九州牧云

1、概述

数据库单表到达一定量后,性能会有衰减,像mysql\sql server等犹为明显,所以需要把这些数据进行分区处理。同时有时候可能出现数据剥离什么的,分区表就更有用处了!

MySQL 5.1 中新增的分区(Partition)功能就开始增加,优势也越来越明显了:

  • 与单个磁盘或文件系统分区相比,可以存储更多的数据
  • 很容易就能删除不用或者过时的数据
  • 一些查询可以得到极大的优化
  • 涉及到 SUM()/COUNT() 等聚合函数时,可以并行进行
  • IO吞吐量更大
  • 分区允许可以设置为任意大小的规则,跨文件系统分配单个表的多个部分。实际上,表的不同部分在不同的位置被存储为单独的表。

2、分区技术支持

在5.6之前,使用这个参数查看当将配置是否支持分区:

代码语言:javascript
复制
mysql> SHOW VARIABLES LIKE '%partition%';
+-----------------------+-------+
|Variable_name          | Value |
+-----------------------+-------+
| have_partition_engine | YES   |
+-----------------------+-------+

如果是yes表示你当前的配置支持分区。 在5.6及以采用后,则采用如下方式进行查看:

代码语言:javascript
复制
mysql> SHOW PLUGINS;
+----------------------------+----------+--------------------+---------+---------+
| Name                       | Status   | Type               | Library | License |
+----------------------------+----------+--------------------+---------+---------+
| binlog                     | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
| mysql_native_password      | ACTIVE   | AUTHENTICATION     | NULL    | GPL     |
..................................................................................
| INNODB_LOCKS               | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| INNODB_LOCK_WAITS          | ACTIVE   | INFORMATION SCHEMA | NULL    | GPL     |
| partition                  | ACTIVE   | STORAGE ENGINE     | NULL    | GPL     |
+----------------------------+----------+--------------------+---------+---------+

42 rows in set (0.00 sec) 最后一行,可以看到partition是ACTIVE的,表示支持分区。

3、分区类型及举例

3.1 范围分区

RANGE 分区:基于属于一个给定连续区间的列值,把多行分配给分区。如时间,连续的常量值等 --按年分区

代码语言:javascript
复制
mysql> use mytest;
Database changed
mysql> create table range_p( 
    -> perid int(11), 
    -> pername char(12) not null, 
    -> monsalary DECIMAL(10,2),
    -> credate datetime 
    -> ) partition by range(year(credate))( 
    -> partition p2011 values less than (2011), 
    -> partition p2012 values less than (2012), 
    -> partition p2013 values less than (2013), 
    -> partition p2014 values less than (2014),
    -> partition p2015 values less than maxvalue 
    -> );
Query OK, 0 rows affected (0.12 sec)

3.2 列举分区

LIST 分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。比如说类似性别(1,2)等属性值。

代码语言:javascript
复制
mysql> create table list_p( 
    -> perid int(11), 
    -> pername char(12) not null,
    -> sex int(1) not null,
    -> monsalary DECIMAL(10,2),
    -> credate datetime 
    -> ) partition by list(sex) (
    -> partition psex1 values in(1),
    -> partition psex2 values in(2));
Query OK, 0 rows affected (0.06 sec)

注意,list只能是数字,使用字符会报错ERROR 1697 (HY000): VALUES value for partition 'psex1' must have type INT。

3.3 离散分区

HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包>含MySQL中有效的、产生非负整数值的任何表达式。

--以int字段hash分区

代码语言:javascript
复制
create table hash_p( 
perid int(11), 
pername char(12) not null,
sex int(1) not null,
monsalary DECIMAL(10,2),
credate datetime 
) partition by hash (perid) 
partitions 8;

--以时间函数hash分区

代码语言:javascript
复制
mysql> create table hash_p( 
    -> perid int(11), 
    -> pername char(12) not null,
    -> sex int(1) not null,
    -> monsalary DECIMAL(10,2),
    -> credate datetime 
    -> ) partition by hash (year(credate)) 
    -> partitions 8;
Query OK, 0 rows affected (0.11 sec)

3.4 键值分区

KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含>整数值。 其分区方法与hash很相似:

代码语言:javascript
复制
mysql> create table key_p( 
    -> perid int(11), 
    -> pername char(12) not null,
    -> sex int(1) not null,
    -> monsalary DECIMAL(10,2),
    -> credate datetime 
    -> ) partition by key (perid) 
    -> partitions 8;
Query OK, 0 rows affected (0.12 sec)

3.5 其它说明

mysql-5.5开始支持COLUMNS分区,可视为RANGE和LIST分区的进化,COLUMNS分区可以直接使用非整形数据进行分区。COLUMNS分区支持以下数据类型: 所有整形,如INT SMALLINT TINYINT BIGINT。FLOAT和DECIMAL则不支持。 日期类型,如DATE和DATETIME。其余日期类型不支持。 字符串类型,如CHAR、VARCHAR、BINARY和VARBINARY。BLOB和TEXT类型不支持。 COLUMNS可以使用多个列进行分区。

代码语言:javascript
复制
mysql> create table range_p( 
    -> perid int(11), 
    -> pername char(12) not null, 
    -> monsalary DECIMAL(10,2),
    -> credate datetime 
    -> ) PARTITION BY RANGE COLUMNS (credate)( 
    -> partition p20151 values less than ('2015-04-01'), 
    -> partition p20152 values less than ('2015-07-01'), 
    -> partition p20153 values less than ('2015-10-01'), 
    -> partition p20154 values less than ('2016-01-01'),
    -> partition p20161 values less than ('2016-04-01'),
    -> partition partlog values less than maxvalue 
    -> );
Query OK, 0 rows affected (0.12 sec)

官方资料:https://dev.mysql.com/doc/refman/5.5/en/partitioning.html

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、概述
  • 2、分区技术支持
  • 3、分区类型及举例
    • 3.1 范围分区
      • 3.2 列举分区
        • 3.3 离散分区
          • 3.4 键值分区
            • 3.5 其它说明
            相关产品与服务
            云数据库 SQL Server
            腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档