MySql分区介绍和Range案例

MySql分区介绍和Range案例

什么是表分区?

通俗地讲表分区是将一个大表,根据条件分割成若干个小表。mysql5.1开始支持数据表分区。

如:某用户表的记录超过了600万条仓储信息,那么就可以根据入库日期将表分区,也可以根据所在地将表分区。当然也可根据其它的条件分区。

为什么要对表进行分区?

  • 为了改善大型表以及具有各种访问模式的表的可伸缩性,可管理性和提高数据库效率。
  • 分区的一些优点包括
    • 与单个磁盘或文件系统分区相比,可以存储更多的数据。
    • 通过删除与增加那些数据有关的分区,很容易地删除或增加那些数据。
    • 一些查询可以得到极大的优化。
    • 通过跨多个磁盘甚至服务器来分散数据查询,来获得更多的查询吞吐量。

基本分区类型

  • RANGE分区:基于连续的区间范围,把数据分配到不同区。只支持整数分区。
  • LIST分区:类似RANGE分区,区别是LIST分区基于给出的枚举的值进行分区,无需按照顺序。只支持整数分区。
  • HASH分区:给定分区个数,按照一个散列函数,确定数据进入哪个分区。
  • KEY分区,类似HASH分区。

首先看一下mysql中的year函数

如下图:

year函数会返回指定日期的年份。

RANGE分区

基于属于一个给定连续区间的列值,把多行分配给分区。

这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义。看一个例子,如下:

java 复制代码
CREATE TABLE part_tab (
    c1 int default NULL,
    c2 varchar(30) default NULL,
    c3 date default NULL
    )engine=INNODB PARTITION BY RANGE (year(c3) )( 
        PARTITION p3 VALUES LESS THAN (2000) ,
        PARTITION p4 VALUES LESS THAN (2010) ,
        PARTITION p11 VALUES LESS THAN MAXVALUE 
    ) ;

上述代码解释,我们会对日期年份进行一个范围分区,如果年份小于2000,那么我们把这些mysql表数据放到我们的p3区;如果2000 <= 年份 < 2010,那么我们把这些mysql表数据放到我们的p4分区;如果2010 <= 年份 < MAXVALUE,那么我们就把这些mysql表数据放到我们的p11分区。

LIST分区

  • 类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
  • LIST分区通过使用"PARTITION BY LIST(expr)"来实现,其中"expr"是某列值或一个基于某个列值,并返回一个整数值的表达式,然后通过"VALUES IN(value_list)"的方式来定义每个分区,其中"value_list"是一个通过逗号分隔的整数列表。

代码如下:

java 复制代码
CREATE TABLE part_tab2 (
   c1 int default NULL,
   c2 varchar(30) default NULL,
   c3 date default NULL
   )engine=INNODB PARTITION BY LIST(year(c3) )( 
       PARTITION p1 VALUES IN (1999,2000) ,
       PARTITION p2 VALUES IN (1998,2005) ,
       PARTITION p2 VALUES IN (2010) 
   ) ;

List分区需要把所有的列值都写出来。

HASH分区

  • 基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的,产生非负整数值的任何表达式。
  • 要使用HASH分区来分割一个表,要在CREATE TABLE语句上添加一个"PARTITION BY HASH(expr)"子句,其中"expr"是一个返回一个整数的表达式。它可以仅仅是字段类型为MySQL整型的一列的名字。此外,你很可能需要在后面添加一个"PARTITIONS num"子句,其中num是一个非负的整数,它表示表将要被分割成的分区的数量。如果没有这个子句,那么分区的数量默认为1个分区。
  • 使用HASH分区的优点在于数据分布较为均匀,如何分区是通过函数进行计算的。

代码例子如下:

java 复制代码
CREATE TABLE part_tab3 (
    c1 int default NULL,
    c2 varchar(30) default NULL,
    c3 date default NULL,
    id INT NOT NULL
    )engine=INNODB PARTITION BY HASH(id) PARTITIONS 4;

上面的代码会分为4个分区,通过id列的值通过mysql内部的哈希函数,mysql会为我们自动的计算出改行的分区,所以使用HASH分区的有点就是数据分布的会比较均匀,如果我们指定了4个分区,一共有1000条数据,最后应该每个区都差不多有250条左右。具体的hash算法是很复杂的,但mysql内部已经帮助我们写好了,所以我们不用太关心。

相关推荐
0xDevNull1 小时前
MySQL数据冷热分离详解
后端·mysql
科技小花2 小时前
数据治理平台架构演进观察:AI原生设计如何重构企业数据管理范式
数据库·重构·架构·数据治理·ai-native·ai原生
一江寒逸2 小时前
零基础从入门到精通MySQL(中篇):进阶篇——吃透多表查询、事务核心与高级特性,搞定复杂业务SQL
数据库·sql·mysql
D4c-lovetrain2 小时前
linux个人心得22 (mysql)
数据库·mysql
阿里小阿希2 小时前
CentOS7 PostgreSQL 9.2 升级到 15 完整教程
数据库·postgresql
荒川之神2 小时前
Oracle 数据仓库雪花模型设计(完整实战方案)
数据库·数据仓库·oracle
做个文艺程序员3 小时前
MySQL安全加固十大硬核操作
数据库·mysql·安全
不吃香菜学java3 小时前
Redis简单应用
数据库·spring boot·tomcat·maven
一个天蝎座 白勺 程序猿3 小时前
Apache IoTDB(15):IoTDB查询写回(INTO子句)深度解析——从语法到实战的ETL全链路指南
数据库·apache·etl·iotdb
不知名的老吴3 小时前
Redis的延迟瓶颈:TCP栈开销无法避免
数据库·redis·缓存