返回顶部
首页 > 资讯 > 数据库 >MySQL COLUMNS分区
  • 273
分享到

MySQL COLUMNS分区

2024-04-02 19:04:59 273人浏览 独家记忆
摘要

介绍COLUMN分区是5.5开始引入的分区功能,只有RANGE COLUMN和LIST COLUMN这两种分区;支持×××、日期、字符串;RANGE和LIST的分区方式非常的相似。  C

介绍

COLUMN分区是5.5开始引入的分区功能,只有RANGE COLUMN和LIST COLUMN这两种分区;支持×××、日期、字符串;RANGE和LIST的分区方式非常的相似。

 

 

COLUMNS和RANGE和LIST分区的区别

1.针对日期字段的分区就不需要再使用函数进行转换了,例如针对date字段进行分区不需要再使用YEAR()表达式进行转换。

2.COLUMN分区支持多个字段作为分区键但是不支持表达式作为分区键。

COLUMNS支持的类型

×××支持:tinyint,smallint,mediumint,int,bigint;不支持decimal和float

时间类型支持:date,datetime

字符类型支持:char,varchar,binary,varbinary;不支持text,blob

一、RANGE COLUMNS分区

1.日期字段分区

MySQL COLUMNS分区

CREATE TABLE members (
    id INT,
    joined DATE NOT NULL
)
PARTITioN BY RANGE COLUMNS(joined) (
    PARTITION a VALUES LESS THAN ('1960-01-01'),
    PARTITION b VALUES LESS THAN ('1970-01-01'),
    PARTITION c VALUES LESS THAN ('1980-01-01'),
    PARTITION d VALUES LESS THAN ('1990-01-01'),
    PARTITION e VALUES LESS THAN MAXVALUE
);

MySQL COLUMNS分区

1.插入测试数据

insert into members(id,joined) values(1,'1950-01-01'),(1,'1960-01-01'),(1,'1980-01-01'),(1,'1990-01-01');

2.查询分区数据分布

SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION 
FROM infORMation_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='members';

MySQL COLUMNS分区

 当前有5个分区只插入了4条记录,其中C分区是没有记录的,结果和实际一样。

3.分析执行计划

explain select id,joined from tb_partition.members where joined=YEAR(now());
explain select id,joined from tb_partition.members where joined='1963-01-01';

MySQL COLUMNS分区

第一条查询使用了函数导致查询没有走具体的分区而是扫描的所有的分区,而第二条查询执行语句查找具体的分区。

2.多个字段组合分区

MySQL COLUMNS分区

CREATE TABLE rcx (
    a INT,
    b INT
    )
PARTITION BY RANGE COLUMNS(a,b) (
     PARTITION p0 VALUES LESS THAN (5,10),
     PARTITION p1 VALUES LESS THAN (10,20),
     PARTITION p2 VALUES LESS THAN (15,30),
     PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE)
);

MySQL COLUMNS分区

注意:多字段的分区键比较是基于数组的比较。它先用插入的数据的第一个字段值和分区的第一个值进行比较,如果插入的第一个值小于分区的第一个值那么就不需要比较第二个值就属于该分区;如果第一个值等于分区的第一个值,开始比较第二个值同样如果第二个值小于分区的第二个值那么就属于该分区。

MySQL COLUMNS分区

例如:

insert into rcx(a,b)values(1,20),(10,15),(10,30);

第一组值:(1,20);1<5所以不需要再比较20了,该记录属于p0分区。

第二组值:(10,15),10>5,10=10且15<20,所以该记录属于P1分区

第三组值:(10,30),10=10但是30>20,所以它不属于p1,它满足10<15所以它属于p2

SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION 
FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='rcx';

MySQL COLUMNS分区

 注意:RANGE COLUMN的多列分区第一列的分区值一定是顺序增长的,不能出现交叉值,第二列的值随便,例如以下分区就会报错

PARTITION BY RANGE COLUMNS(a,b) (
     PARTITION p0 VALUES LESS THAN (5,10),     PARTITION p1 VALUES LESS THAN (10,20),
     PARTITION p2 VALUES LESS THAN (8,30),
     PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE)
);

由于分区P2的第一列比P1的第一列要小,所以报错,后面的分区第一列的值一定要比前面分区值要大,第二列没规定。

二、LIST COLUMNS分区

1.非×××字段分区

MySQL COLUMNS分区

CREATE TABLE listvar (
    id INT NOT NULL,
    hired DATETIME NOT NULL)
PARTITION BY LIST COLUMNS(hired) 
(
    PARTITION a VALUES IN ('1990-01-01 10:00:00','1991-01-01 10:00:00'),
    PARTITION b VALUES IN ('1992-01-01 10:00:00'),
    PARTITION c VALUES IN ('1993-01-01 10:00:00'),
    PARTITION d VALUES IN ('1994-01-01 10:00:00')
);ALTER TABLE listvar ADD INDEX ix_hired(hired);INSERT INTO listvar() VALUES(1,'1990-01-01 10:00:00'),(1,'1991-01-01 10:00:00'),(1,'1992-01-01 10:00:00'),(1,'1993-01-01 10:00:00');

MySQL COLUMNS分区

LIST COLUMNS分区对分×××字段进行分区就无需使用函数对字段处理成×××,所以对非×××字段进行分区建议选择COLUMNS分区。

MySQL COLUMNS分区

EXPLAIN SELECT * FROM listvar WHERE hired='1990-01-01 10:00:00';

MySQL COLUMNS分区

 2.多字段分区

MySQL COLUMNS分区

CREATE TABLE listvardou (
    id INT NOT NULL,
    hired DATETIME NOT NULL)
PARTITION BY LIST COLUMNS(id,hired) 
(
    PARTITION a VALUES IN ( (1,'1990-01-01 10:00:00'),(1,'1991-01-01 10:00:00') ),
    PARTITION b VALUES IN ( (2,'1992-01-01 10:00:00') ),
    PARTITION c VALUES IN ( (3,'1993-01-01 10:00:00') ),
    PARTITION d VALUES IN ( (4,'1994-01-01 10:00:00') )
);ALTER TABLE listvardou ADD INDEX ix_hired(hired);INSERT INTO listvardou() VALUES(1,'1990-01-01 10:00:00'),(1,'1991-01-01 10:00:00'),(2,'1992-01-01 10:00:00'),(3,'1993-01-01 10:00:00');SELECT PARTITION_NAME,PARTITION_METHOD,PARTITION_EXPRESSION,PARTITION_DESCRIPTION,TABLE_ROWS,SUBPARTITION_NAME,SUBPARTITION_METHOD,SUBPARTITION_EXPRESSION 
FROM information_schema.PARTITIONS WHERE TABLE_SCHEMA=SCHEMA() AND TABLE_NAME='listvardou';

MySQL COLUMNS分区

MySQL COLUMNS分区

EXPLAIN SELECT * FROM listvardou WHERE id=1 and hired='1990-01-01 10:00:00';

MySQL COLUMNS分区

由于分区是组合字段,filtered只有50%,对于组合分区索引也最好是建组合索引,其实如果能通过id字段刷选出数据,单独建id字段的索引也是有效果的,但是组合索引的效果是最好的,其实和非分区键索引的概念差不多。

ALTER TABLE listvardou ADD INDEX ix_hired1(id,hired);

MySQL COLUMNS分区

备注:文章中的示例摘自Mysql官方参考手册

 

三、移除表的分区

ALTER TABLE tablename
REMOVE PARTITIONING ;

注意:使用remove移除分区是仅仅移除分区的定义,并不会删除数据和drop PARTITION不一样,后者会连同数据一起删除

 


您可能感兴趣的文档:

--结束END--

本文标题: MySQL COLUMNS分区

本文链接: https://lsjlt.com/news/38973.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • MySQL COLUMNS分区
    介绍COLUMN分区是5.5开始引入的分区功能,只有RANGE COLUMN和LIST COLUMN这两种分区;支持×××、日期、字符串;RANGE和LIST的分区方式非常的相似。  C...
    99+
    2024-04-02
  • 【mysql表分区系】mysql创建分区表提示A PRIMARY KEY must include all columns in the table‘s partitioning function
    首先声明下我这边使用的mysql版本是5.7.29版本,当然下面的问题我这边也是基于这个版本。这里因为没有考证其他版本是否也会有这些问题,可自行官方文档来查阅资料 一个唯一键必须包含表分区函数所有的列,根据这个错误提示我们大概就知道怎么处理...
    99+
    2023-10-21
    mysql 数据库
  • mysql分区表:日期分区
    mysql分区表:日期分区 1.创建分区表2.查看分区3.添加分区4.存储过程:分区删除与创建5.事件定时6.触发器设计:子表每插入一行,总表获得一行7.创建索引8.添加枚举型字段 1.创建分区表 CREATE TAB...
    99+
    2023-08-21
    mysql 数据库
  • MySQL分区之LIST分区详解
    目录介绍一、创建分区1.插入数据2.插入不在列表中的值二、分区管理1.增加分区2.合并分区3.拆分分区4.删除分区三、其它分区1.对时间字段进行分区四、移除表的分区参考:总结介绍 L...
    99+
    2024-04-02
  • MySQL分区之RANGE分区详解
    目录介绍一、RANGE分区1.创建分区2.性能分析3.增加分区4.删除分区5.拆分合并分区二、日期字段分区方法三、null值处理四、移除表的分区总结介绍 RANGE分区基于一个给定的...
    99+
    2024-04-02
  • MySQL分区之KEY分区详解
    目录介绍一、常规KEY二、LINEAR KEY三、分区管理四、移除表的分区总结介绍 KEY分区和HASH分区相似,但是KEY分区支持除text和BLOB之外的所有数据类型的分区,而H...
    99+
    2024-04-02
  • MySQL分区之HASH分区详解
    目录介绍一、常规HASH二、线性HASH(LINEAR HASH)三、分区管理1.合并分区2.增加分区四、移除表的分区总结介绍 基于给定的分区个数,将数据分配到不同的分区,HASH分...
    99+
    2024-04-02
  • MySQL分区之子分区详解
    目录介绍一、创建子分区1.不定义每个子分区2.定义每个子分区3.测试数据二、分区管理1.合并分区2.拆分分区3.删除分区三、错误的子分区创建四、移除表的分区总结介绍 子分区其实是对每...
    99+
    2024-04-02
  • MySQL/MariaDB 分区
    查看表的创建命令SHOW CREATE TABLE my_table_name;查看表是否分区(Create_options 字段为 partitioned 或空)SHOW TABLE STATUS LIK...
    99+
    2024-04-02
  • centos7-mysql-分区
    分区跟分表类似,目的是将一张表分到不通的存储中,这样可以减少单一磁盘IO占用,提高数据库效率分区主要有两种形式水平分区对表的行进行分区,垂直分区减少表的宽度, 想使用分区,需要先查看当前是否支持s...
    99+
    2024-04-02
  • MySql之分区分表
    MySql之分区分表分表的概念分表:将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些表可以分布在同一块磁盘上,也可...
    99+
    2024-04-02
  • Mysql 分区介绍(九) —— 分区管理
    一、分区操作 1. 将没有分区的表改为分区表 ALTER TABLE trb3 PARTITION BY KEY(id) PARTITIONS 2; 2. 删除分区 # 删除所有分区, 同时数据丢失 ALT...
    99+
    2024-04-02
  • mysql分区及分表(一)
                                 ...
    99+
    2024-04-02
  • mysql分区及分表(二)
                                mysql...
    99+
    2024-04-02
  • MySQL分区摘要
    MySQL支持的分区类型为水平分区,并不支持垂直分区。 水平分区,以行为单位,划分到不同的物理文件中;垂直分区即针对列划分。 MySQL的分区,除了InnoDB支持,MyISAM也支持,所以分区并不是引擎级...
    99+
    2024-04-02
  • MySQL的分区(二)
    分区裁剪 使用explain partitions能显示出是否进行了分区裁剪. mysql> drop table t2; Query OK, 0 rows affected (...
    99+
    2024-04-02
  • MySQL分区学习
    https://dev.mysql.com/doc/refman/5.7/en/alter-table-partition-operations.html 一、   ...
    99+
    2024-04-02
  • MySQL分区介绍
    不论创建何种类型的分区,如果表中存在主键或唯一索引时,分区列必须是唯一索引的一个组成部分 mysql> create table t1(     -> col1 i...
    99+
    2024-04-02
  • MySQL的分区(一)
    mysql支持范围分区(range)、列表分区(list)、column分区、哈希分区(hash)、key分区、字段列表分区等 以timestamp类型字段作为分区键进行范围分区,有两种方式: C...
    99+
    2024-04-02
  • mysql新增分区
    在 MySQL 中,你可以使用 ALTER TABLE 语句来新增分区。 例如,假设你有一个名为 users 的表,并希望为它新增一个名为 p1 的分区,可以使用以下语句: ALTER TABLE users ADD PARTITI...
    99+
    2023-09-25
    mysql 数据库
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作