mysql5.7子分区可以是list的吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql5.7子分区可以是list的吗相关的知识,希望对你有一定的参考价值。

mysql5.7子分区可以是list的。
子分区:也叫作复合分区或者组合分区,即在主分区下再做一层分区,将数据再次分割。

注意:1、RANGE 分区、LIST 分区、HASH 分区都要求分区键必须是 INT 类型,或者通过表达式返回 INT 类型;但 KEY 和 COLUMNS 分区可以使用其他类型的列(BLOB 或 TEXT 列类型除外)作为分区键。

​ 2、无论是哪种分区类型,要么分区表上没有主键/唯一键,要么分区表的主键/唯一键都在分区键上

​ 3、MySQL表的列名、别名、分区名是不区分大小写的。
参考技术A mysql分区之LIST分区讲解 MySQL中的LIST分区在很多方面类似于RANGE分区。和按照RANGE分区一样,每个分区必须明确定义。它们的主要区别在于,LIST分区中每个分区的定义和选择是基于某列的值从属于一个值列表集中的一个值,而RANGE分区是从属于一个连续区间值
  mysql分区之LIST分区讲解
  MySQL中的LIST分区在很多方面类似于RANGE分区。和按照RANGE分区一样,每个分区必须明确定义。它们的主要区别在于,,LIST分区中每个分区的定义和选择是基于某列的值从属于一个值列表集中的一个值,而RANGE分区是从属于一个连续区间值的集合。LIST分区通过使用“PARTITION BY LIST(expr)”来实现,其中“expr” 是某列值或一个基于某个列值、并返回一个整数值的表达式,然后通过“VALUES IN (value_list)”的方式来定义每个分区,其中“value_list”是一个通过逗号分隔的整数列表。
  注释:在MySQL 5.1中,当使用LIST分区时,有可能只能匹配整数列表。
  不像按照RANGE定义分区的情形,LIST分区不必声明任何特定的顺序 。
  对于下面给出的例子,我们假定将要被分区的表的基本定义是通过下面的“CREATE TABLE”语句提供的:
  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,
  store_id INT
  );
  (这和18.2.1节,“RANGE分区” 中的例子中使用的是同一个表)。
  假定有20个音像店,分布在4个有经销权的地区,如下表所示:
  地区商店ID 号
  北区3, 5, 6, 9, 17
  东区1, 2, 10, 11, 19, 20
  西区4, 12, 13, 14, 18
  中心区7, 8, 15, 16
  要按照属于同一个地区商店的行保存在同一个分区中的方式来分割表,可以使用下面的“CREATE TABLE”语句:
  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,
  store_id INT
  )
  PARTITION BY LIST(store_id)
  PARTITION pNo
参考技术B mysql分区之LIST分区讲解 MySQL中的LIST分区在很多方面类似于RANGE分区。和按照RANGE分区一样,每个分区必须明确定义。它们的主要区别在于,LIST分区中每个分区的定义和选择是基于某列的值从属于一个值列表集中的一个值,而RANGE分区是从属于一个连续区间值
  mysql分区之LIST分区讲解
  MySQL中的LIST分区在很多方面类似于RANGE分区。和按照RANGE分区一样,每个分区必须明确定义。它们的主要区别在于,,LIST分区中每个分区的定义和选择是基于某列的值从属于一个值列表集中的一个值,而RANGE分区是从属于一个连续区间值的集合。LIST分区通过使用“PARTITION BY LIST(expr)”来实现,其中“expr” 是某列值或一个基于某个列值、并返回一个整数值的表达式,然后通过“VALUES IN (value_list)”的方式来定义每个分区,其中“value_list”是一个通过逗号分隔的整数列表。
  注释:在MySQL 5.1中,当使用LIST分区时,有可能只能匹配整数列表。
  不像按照RANGE定义分区的情形,LIST分区不必声明任何特定的顺序 。

Mysql 分区介绍 —— LIST COLUMNS分区

Mysql 5.6开始支持LIST COLUMNS分区, 可以开始使用多个列作为分区的键, 并且列的数据类型除了数字类型可以作为分区列; 你也可以使用字符串类型, DATE和DATETIME

你有一个在12个城市客户的业务, 为了销售和市场的目的, 你的组织每3个城市划分为一个区域
针对LIST COLUMNS分区, 你可以基于城市的名称创建一个客户数据表并声明4个分区当你的客户存在对应的这个区域:

CREATE TABLE customers_1 (
    first_name VARCHAR(25),
    last_name VARCHAR(25),
    street_1 VARCHAR(30),
    street_2 VARCHAR(30),
    city VARCHAR(15),
    renewal DATE
)
PARTITION BY LIST COLUMNS(city) (
    PARTITION pRegion_1 VALUES IN(‘Oskarshamn‘, ‘H?gsby‘, ‘M?nster?s‘),
    PARTITION pRegion_2 VALUES IN(‘Vimmerby‘, ‘Hultsfred‘, ‘V?stervik‘),
    PARTITION pRegion_3 VALUES IN(‘N?ssj?‘, ‘Eksj?‘, ‘Vetlanda‘),
    PARTITION pRegion_4 VALUES IN(‘Uppvidinge‘, ‘Alvesta‘, ‘V?xjo‘)
);

使用日期分区

CREATE TABLE customers_2 (
    first_name VARCHAR(25),
    last_name VARCHAR(25),
    street_1 VARCHAR(30),
    street_2 VARCHAR(30),
    city VARCHAR(15),
    renewal DATE
)
PARTITION BY LIST COLUMNS(renewal) (
    PARTITION pWeek_1 VALUES IN(‘2010-02-01‘, ‘2010-02-02‘, ‘2010-02-03‘,
        ‘2010-02-04‘, ‘2010-02-05‘, ‘2010-02-06‘, ‘2010-02-07‘),
    PARTITION pWeek_2 VALUES IN(‘2010-02-08‘, ‘2010-02-09‘, ‘2010-02-10‘,
        ‘2010-02-11‘, ‘2010-02-12‘, ‘2010-02-13‘, ‘2010-02-14‘),
    PARTITION pWeek_3 VALUES IN(‘2010-02-15‘, ‘2010-02-16‘, ‘2010-02-17‘,
        ‘2010-02-18‘, ‘2010-02-19‘, ‘2010-02-20‘, ‘2010-02-21‘),
    PARTITION pWeek_4 VALUES IN(‘2010-02-22‘, ‘2010-02-23‘, ‘2010-02-24‘,
        ‘2010-02-25‘, ‘2010-02-26‘, ‘2010-02-27‘, ‘2010-02-28‘)
);

但是这种情况在日期增长到非常大的时候是很复杂的, 所以这种还是使用RANGE 分区方式比较好。

以上是关于mysql5.7子分区可以是list的吗的主要内容,如果未能解决你的问题,请参考以下文章

windows10安装mysql5.7.17是这样安装的吗?

MySQL5.7传输表空间——迁移分区表

Mysql5.7—mysql优化分区分表(必备)

MySQL 子分区

(转)一个MySQL 5.7 分区表性能下降的案例分析

MySQL5.7性能优化系列——SQL语句优化——使用物化策略优化子查询