数据库技术:详解MySQL分区表分享

前言:

分区是一种表的设计模式,通俗地讲表分区是将一大表,根据条件分割成若干个小表。但是对于应用程序来讲,分区的表和没有分区的表是一样的。换句话来讲,分区对于应用是透明的,只是数据库对于数据的重新整理。本篇文章给大家带来的内容是关于MySQL中分区表的介绍及使用场景,有需要的朋友可以参考一下,希望对你有所帮助。

1.分区的目的及分区类型

MySQL在创建表的时候可以通过使用PARTITIONBY子句定义每个分区存放的数据。在执行查询的时候,优化器根据分区定义过滤那些没有我们需要的数据的分区,这样查询就可以无需扫描所有分区,只需要查找包含需要数据的分区即可。

分区的另一个目的是将数据按照一个较粗的粒度分别存放在不同的表中。这样做可以将相关的数据存放在一起,另外,当我们想要一次批量删除整个分区的数据也会变得很方便。

下面简单介绍下四种常见的分区类型:

RANGE分区:最为常用,基于属于一个给定连续区间的列值,把多行分配给分区。最常见的是基于时间字段。 LIST分区:LIST分区和RANGE分区类似,区别在于LIST是枚举值列表的集合,RANGE是连续的区间值的集合。 HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。 KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

上述四种分区类型中,RANGE分区即范围分区是最常用的。RANGE分区的特点是多个分区的范围要连续,但是不能重叠,默认情况下使用VALUESLESSTHAN属性,即每个分区不包括指定的那个值。

2.分区操作示例

本节内容以RANGE分区为例,介绍下分区表相关的操作。

#创建分区表 mysql>CREATETABLE`tr`( ->`id`INT, ->`name`VARCHAR(50), ->`purchased`DATE ->)ENGINE=InnoDBDEFAULTCHARSET=utf8 ->PARTITIONBYRANGE(YEAR(purchased))( ->PARTITIONp0VALUESLESSTHAN(1990), ->PARTITIONp1VALUESLESSTHAN(1995), ->PARTITIONp2VALUESLESSTHAN(2000), ->PARTITIONp3VALUESLESSTHAN(2005), ->PARTITIONp4VALUESLESSTHAN(2010), ->PARTITIONp5VALUESLESSTHAN(2015) ->); QueryOK,0rowsaffected(0.28sec) #插入数据 mysql>INSERTINTO`tr`VALUES ->(1,'deskorganiser','2003-10-15'), ->(2,'alarmclock','1997-11-05'), ->(3,'chair','2009-03-10'), ->(4,'bookcase','1989-01-10'), ->(5,'exercisebike','2014-05-09'), ->(6,'sofa','1987-06-05'), ->(7,'espressomaker','2011-11-22'), ->(8,'aquarium','1992-08-04'), ->(9,'studydesk','2006-09-16'), ->(10,'lavalamp','1998-12-25'); QueryOK,10rowsaffected(0.03sec) Records:10Duplicates:0Warnings:0

创建后可以看到,每个分区都会对应1个ibd文件。上面创建语句还是很好理解的,在此分区表中,通过YEAR函数取出DATE日期中的年份并转化为整型,年份小于1990的存储在分区p0中,小于1995的存储在分区p1中,以此类推。请注意,每个分区的定义顺序是从最低到最高。为了防止插入的数据因找不到相应分区而报错,我们应该及时创建新的分区。下面继续展示关于分区维护的其他操作。

#查看某个分区的数据 mysql>SELECT*FROMtrPARTITION(p2); +------+-------------+------------+ |id|name|purchased| +------+-------------+------------+ |2|alarmclock|1997-11-05| |10|lavalamp|1998-12-25| +------+-------------+------------+ 2rowsinset(0.00sec) #增加分区 mysql>altertabletraddpartition( ->PARTITIONp6VALUESLESSTHAN(2020) ->); QueryOK,0rowsaffected(0.06sec) Records:0Duplicates:0Warnings:0 #拆分分区 mysql>altertabletrreorganizepartitionp5into( ->partitions0valueslessthan(2012), ->partitions1valueslessthan(2015) ->); QueryOK,0rowsaffected(0.26sec) Records:0Duplicates:0Warnings:0 #合并分区 mysql>altertabletrreorganizepartitions0,s1into( ->partitionp5valueslessthan(2015) ->); QueryOK,0rowsaffected(0.12sec) Records:0Duplicates:0Warnings:0 #清空某分区的数据 mysql>altertabletrtruncatepartitionp0; QueryOK,0rowsaffected(0.11sec) #删除分区 mysql>altertabletrdroppartitionp1; QueryOK,0rowsaffected(0.06sec) Records:0Duplicates:0Warnings:0 #交换分区 #先创建与分区表同样结构的交换表 mysql>CREATETABLE`tr_archive`( ->`id`INT, ->`name`VARCHAR(50), ->`purchased`DATE ->)ENGINE=InnoDBDEFAULTCHARSET=utf8; QueryOK,0rowsaffected(0.28sec) #执行exchange交换分区 mysql>altertabletrexchangePARTITIONp2withtabletr_archive; QueryOK,0rowsaffected(0.13sec)

3.分区注意事项及适用场景

其实分区表的使用有很多限制和需要注意的事项,参考官方文档,简要上述就是数据库技术:详解MySQL分区表分享的全部内容,如果对大家有所用处且需要了解更多关于mysql数据库学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请点击右边联系管理员删除。

如若转载,请注明出处:https://www.ctvol.com/dtteaching/909264.html

(0)
取名很有趣取名很有趣
上一篇 2021年10月23日
下一篇 2021年10月23日

精彩推荐