MySQL3-分区与分表

目录

零、主要参考网页

一、概述

二、分区类型以及创建方式

三、分区表的管理

四、获取分区表信息

五、分区的局限与分表

零、主要参考网页

http://www.2cto.com/database/201503/380348.html【mysql分表和表分区详解】

http://www.cnblogs.com/zemliu/archive/2013/07/21/3203511.html【MySQL分区表】

http://x125858805.iteye.com/blog/2068120【MYSQL--表分区、查看分区(转)】

http://blog.csdn.net/tjcyjd/article/details/11194489【深入解析MySQL分区(Partition)功能】

一、概述

1、功能:主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减sql语句的响应时间,同时对于应用来说分区完全是透明的。

2、水平分区和垂直分区:水平分区是对行进行分区;垂直分区是对列进行分区,减小每个分区中数据的宽度,使用很少。

3、分区类型:RANGE分区、LIST分区、HASH分区、KEY分区以及复合分区。

4、MySQL分区实现:逻辑上是一个独立的表,但是底层由多个物理子表实现。

5、一个表最多只能有1024个分区。

6、查询时只能根据列过滤分区,使用列的表达式不行;即便这个表达式就是分区函数也不行。

二、分区类型以及创建方式

0、共性

(1)如果表含有主键,则做分区的列必须包含在主键中;如果表不含有主键,则无所谓。

(2)分区键必须是INT类型,或者通过表达式返回INT类型,可以为NULL。唯一的例外是当分区类型为KEY分区的时候,可以使用其他类型的列作为分区键( BLOB or TEXT 列除外)。【注意,to_days函数可以将一个日期转化为INTEGER,作为分区表达式,而且有函数将字符串转化为日期;但是如果将字符串转为日期,在使用to_days,则不能作为分区表达式;这个时候要考虑换列做分区,或者使用key分区】

(3)如果分区键所在列没有not null约束:range分区表的null行将被保存在范围最小的分区;list分区表的null行将被保存到list为0的分区;在按HASH和KEY分区的情况下,任何产生NULL值的表达式mysql都视同它的返回值为0。为了避免这种情况的产生,建议分区键设置成NOT NULL。

(4)对分区表的分区键创建索引,那么这个索引也将被分区,分区表没有全局索引一说。注意,oracle是在分区与索引时,是可以选择全局索引还是分区索引的。

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

(1)示例1:

create table emp(

empno varchar(20) not null,

    empname varchar(20),

    deptno int,

    birthdate date,

    salary int

) partition by range(salary)(

    partition p1 values less than (1000),

    partition p2 values less than (2000),

    partition p3 values less than maxvalue

);

(2)示例2:(在本例中,没有直接使用列而是使用了表达式year(birthdate);使用表达式必须有返回值)

create table emp(

empno varchar(20) not null ,

    empname varchar(20),

    deptno int,

    birthdate date not null,

    salary int

) partition by range(year(birthdate))(

    partition p1 values less than (1980),

    partition p2 values less than (1990),

    partition p3 values less than maxvalue

);

(3)maxvalue只能出现在最后一个分区;如果没有使用形如maxvalue,可能导致插入的数据不属于任何分区,从而导致数据无法插入(如:Table has no partition for value ……)

2、LIST 分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择;如果插入的数据不能匹配任何分区,则插入失败。

create table emp(

empno varchar(20) not null ,

    empname varchar(20),

    deptno int,

    birthdate date not null,

    salary int

) partition by list(deptno)(

    partition p1 values in (10),

    partition p2 values in (20),

    partition p3 values in (30)

);

3、HASH分区:基于用户定义的表达式的返回值进行选择,该表达式使用一个或多个列值进行计算;这个表达式可以是任何产生非负整数值的表达式。

(1)目标:确保数据在预先确定数目的分区中平均分布。不需要指定一行数据在哪个分区中(RANGE和LIST需要),MySQL自动完成;只需要指定表达式以及分区数量。hash分区和key分区,经过测试,有个奇怪的特点:当分区数量为奇数时,分布较为平均;当分区质量为偶数时,则会出现一半分区没有元素的现象。【网上说是质数和合数,但我测试发现,2不平均,而9/15等则较为平均,故猜测是奇数和偶数】

(2)示例

create table emp(

empno varchar(20) not null ,

    empname varchar(20),

    deptno int,

    birthdate date not null,

    salary int

) partition by hash(year(birthdate))

    partitions 4;//4表示分成4份

4、KEY分区:类似于按HASH分区,区别在于KEY分区不能指定表达式,只能指定一列或多列;同样需要指定分区数量。

create table emp(

empno varchar(20) not null ,

    empname varchar(20),

    deptno int,

    birthdate date not null,

    salary int

) partition by key(birthdate)

    partitions 4;

5、复合分区:包括range-hash、range-key、list-hash、list-key

示例:range-hash

create table emp(

empno varchar(20) not null ,

empname varchar(20),

deptno int,

birthdate date not null,

salary int

) partition by range(salary)

subpartition by hash(year(birthdate))

subpartitions 3(

partition p1 values less than (2000),

partition p2 values less than maxvalue

);

三、分区表的管理

1、删除分区:同时删除分区内的数据;只可以用于range和list。

alter table emp drop partition p1;

alter table emp drop partition p2,p3;

2、增加分区:如果range分区中使用了maxvalue,则无法在后面增加分区,因为形如maxvalue必须是最后一个分区;可以先删除再添加,但是如果有数据在最后一个分区,会导致数据丢失。只可以用于range和list;不会丢失数据。

alter table emp add partition (partition p3 values less than (4000));

alter table emp add partition (partition p3 values in (40));

3、分解分区:只可以用于range和list;不会丢失数据。

alter table emp reorganize partition p1 into(

partition p1 values less than (100),

partition p3 values less than (1000)

);

4、合并分区:只可以用于range和list;不会丢失数据。

alter table emp reorganize partition p1,p3 into (partition p1 values less than (1000));

5、重新定义分区表:可以用于四种分区表;不会丢失数据。

alter table emp partition by hash(salary)partitions 7;---hash

alter table emp partition by range(salary)(

partition p1 values less than (2000),

partition p2 values less than (4000)

);---range

6、删除所有分区:可以用于四种分区表;不会丢失数据。

alter table emp remove partitioning;

7、重建分区:可以用于四种分区表;不会丢失数据。当用于hash和key分区时,可以先查询分区名称再重建(因为不是我们指定的),不过一般是p0,p1,p2...的形式。用于整理分区碎片,效果与先删除保存在分区中的记录,再将它们插入相同。

ALTER TABLE emp rebuild partition p1,p2;

8、优化分区:可以用于四种分区表;不会丢失数据。如果从分区中删除了大量的行,或者对一个带有可变长度的行作了许多修改,可以用来收回没有使用的空间,并整理分区数据文件的碎片。【我的MySQL不支持:Table does not support optimize on partitions. All partitions will be rebuilt and analyzed.】

ALTER TABLE emp optimize partition p1,p2;

9、保存分区:可以用于四种分区表;不会丢失数据。读取并保存分区的键分布;保存到哪里呢???

ALTER TABLE emp3 analyze partition p1,p2;

10、检查分区:可以用于四种分区表;不会丢失数据。判断数据或索引是否已经被破坏,如果破坏使用修复分区进行修复。

ALTER TABLE emp CHECK partition p1,p2;

11、修复分区:可以用于四种分区表;不会丢失数据。

ALTER TABLE emp repair partition p1,p2;

四、获取分区表信息

1、show create table 表名

2、show table status:可以查看是不是分区表;不加表明,显示数据库内所有表的状态

3、查看information_schema.partitions表

select

partition_name part,

partition_expression expr,

partition_description descr,

table_rows

from information_schema.partitions where

table_schema = schema()

and table_name=‘表名‘;

应该注意到,查询到分区表的数据统计未必准确(有时连续查询没有变动的表结果都可能不同);准确与否与搜索引擎有关,比如Innodb的不准确。

4、explain partitions select语句:通过此语句来显示扫描哪些分区,及他们是如何使用的;因此可以查看分区是否对查询过程有优化效果。

五、分区的局限与分表

1、分区与索引

(1)作用类似

在执行查询时,优化器会根据分区定义过滤那些没有我们需要数据的分区,否则分区对查询的优化就没有什么效果了。因此,查询条件应该与分区列匹配。

理解分区:可以将分区当做索引的最初形态,以代价非常小的方式定位到需要的数据在哪一片“区域”。这样也就可以理解,无论是分区还是索引,都要求查询条件与之匹配,查询才有优化效果。

(2)有索引为什么还需要分区

当表数据量超大的时候,索引是有问题的。一方面,除非索引覆盖了查询,否则数据库根据索引扫描的结果去数据库中查找,如果数据量巨大,将产生大量随机I/O,数据库响应时间会超长。另一方面,索引也会很大。

(3)实现细节

分区表的底层由多个物理子表实现,因此分区表的索引只是在各个底层表上各自加上一个完全相同的索引;没有全局索引一说。

(4)问题:分区列和索引列不匹配

如果分区列和索引列不匹配,那么根据索引的条件查询,不能够过滤分区;就会导致需要把每个分区的索引都读到内存,效率极低,尽量避免。

但是实际上,有些时候很难避免索引列与分区列不一致:比如某些表有不止一个索引。

此时,可以考虑分表。

2、分表

(1)顾名思义,当数据量过大时,将不同的数据放到不同的表中。选取用于分表的字段和规则应该注意,这个字段应比较常用(因为每次增删改查都需要根据这个字段确定使用哪个表),也尽量不要使用完全随机数(不好根据规则确定表)。

(2)动态sql:在应用层进行判断,选择增删改查所使用的表;代码略繁琐,且随着新加表,需要发版。使用Hibernate的sql功能,直接用sql语句和表名进行操作;PO不与表绑定(严格来说不是PO)。

(3)NamingStrategy:传入一个表名,命名策略可以输出一个表名;但是由于输入只有表名,因此不可能根据数据的不同动态选择表名。命名策略一般做的事情是进行一些大小写转换,加前后缀,或者在表名中加入当前时间的信息(这个在每天的表都需要单独存,且以后不需要访问今天的表或访问时会带上时间时比较有用)。

(4)hibernate shards:google提交给hibernate社区的源码。每个分片都要有自己的配置文件,强项是分库。

(5)Inceptor:在hibernate生成最终的sql语句之前,对sql进行一些改变。这个功能挺强大,而且将对分表的处理放在了最底层,逻辑上比较通顺。但是也有一些弊端:代码繁琐;每个sql都会被拦截,可能会出问题;对写sql的格式会有一定要求(这样拦截时才容易判断出哪些是真正需要拦截的);不直观。

时间: 2024-07-30 03:24:20

MySQL3-分区与分表的相关文章

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

小生博客:http://xsboke.blog.51cto.com 小生 Q Q:1770058260 -------谢谢您的参考,如有疑问,欢迎交流 一. 分表 1. 分表简介 分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表. 如果正在使用的表需要进行分区,就需要同时修改app的规则,使mysql可以得知用户查询的数据在哪. 2. 分表类型 分为垂直切分和水平切分 垂直切分:将某些列分到另一个表 水平切分:将某些行分到另一个表 3. 分表的方式 1) Mysql集群 它并不是

mysql分区和分表

mysql分表和分区 1.mysql分表 什么是分表? 分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,每个表都对应三个文件,MYD数据文件,MYI索引文件,frm表结构文件.如果是Innodb存储引擎,索引文件和数据文件存放在同一个位置.这些表可以分布在同一块磁盘上,也可以在不同的机器上. app读写的时候根据事先定义好的规则得到对应的的表明,然后去操作它. 将单个数据库表进行拆分,拆分成多个数据表,然后用户访问的时候,根据一定的算法(如用hash的方式,也可以用取余的方式)

Mysql第八天 分区与分表

分区表 主要提供例如以下的特性,或者适合如此场景: 数据量非常大, 或者仅仅有表中最后的部分有热点数据.其它均为历史数据 分区表数据更easy维护,能够对独立的分区删除等操作 分区表的数据能够分布在不同的物理设备上.从而高效地利用多个硬件设备. 能够避免一些特殊瓶颈.比方InnoDB的单个索引的相互排斥訪问 能够备份和恢复独立的分区 创建分区表 通常有这么几种分法.由于主键或者是唯一约束键必须有一部分包括在分区键中,所以一般要不无主键,要不就依照自增主键的id进行范围分区,要不就把分区字段和主键

Mysql 数据库优化(三)——分区和分表【个人经验】

引:MyISAM存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件. 1.首先肯定会有任何存储引擎都不可缺少的存放表结构定义信息的.frm文件, 2.另外还有.MYD和.MYI文件,分别存放了表的数据(.MYD)和索引数据(.MYI). 每个表都有且仅有这样三个文件做为MyISAM存储类型的表的存储,也就是说不管这个表有多少个索引,都是存放在同一个.MYI文件中. MyISAM支持以下三种类型的索引: 1.B-Tree索引 B-Tree索引,顾名思义,就是所有的索引节点都按照ba

mysql分区及分表(一)

mysql分区分表 1.分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件 mysql分表分为垂直切分和水平切分 垂直切分是指数据表列的拆分,把一张列比较多的表拆分为多张表通常我们按以下原则进行垂直拆分:把不常用的字段单独放在一张表; 水平拆分是指数据表行的拆分,把一张的表的数据拆成多张表来存放. 水平拆分原则:通常情况下,我们使用hash.取模等方式来进行表的拆分 通过用ID取模的方法把数据分散到四张表内

大数据技术之_29_MySQL 高級面试重点串讲_02_Mysql 简介+Linux 版的安装+逻辑架构介绍+性能优化+性能分析+查询截取分析+分区分库分表简介+锁机制+主从复制

第1章 Mysql 简介1.1 概述1.2 高级 MySQL第2章 Mysql Linux 版的安装2.1 下载地址2.2 检查当前系统是否安装过 mysql2.3 修改 Mysql 配置文件位置2.4 修改字符集和数据存储路径2.5 MySQL 的安装位置说明2.6 Mysql 配置文件说明2.7 Mysql 的数据存放目录第3章 Mysql 逻辑架构介绍3.1 总体概览3.2 查询说明第4章 Mysql 性能优化4.1 影响 mysql 的性能因素4.2 查询与索引优化分析4.2.1 性能下

(转)MYSQL 的分区 、分表、集群

转发:https://www.cnblogs.com/myvic/p/7711498.html MYSQL 的分区 .分表.集群 1.分区 mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件,一个是frm存放表结构的,一个是myd存放表数据的, 一个是myi存表索引的.如果一张表的数据量太大的话,那么myd,myi就会变的很大,查找数据就会变的很慢,这个时候我们可以利用mysql的分区功

Mysql分区和分表介绍

为什么要分区和分表 我们的数据库数据越来越大,随之而来的是单个表中数据太多,以至于查询速度过慢,而且由于表的锁机制导致应用操作也受到严重影响,出现数据库性能瓶颈. MySQL中有一种机制是表锁定和行锁定,是为了保证数据的完整性.表锁定表示你们都不能对这张表进行操作,必须等我对表操作完才行.行锁定也一样,别的sql必须等我对这条数据操作完了,才能对这条数据进行操纵.但出现这种情况时,我们可以考虑分表或者分区. 分表 什么是分表 分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,每个

mysql的分区和分表

分区 分区就是把一个数据表的文件和索引分散存储在不同的物理文件中. mysql支持的分区类型包括Range.List.Hash.Key,其中Range比较常用: RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区. LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择. HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算.这个函数可以包含MySQL 中有效的.产生非负整数

分区和分表

谈论数据库架构和数据库优化的时候,我们经常会听到“分库分表”.“分片”这样的关键词.让人感到高兴的是,这些朋友所服务的公司业务量正在(或者即将面临)高速增长,技术方面也面临着一些挑战. 垂直分 垂直分表 垂直分表在日常开发和设计中比较常见,通俗的说法叫做“大表拆小表”,拆分是基于关系型数据库中的“列”(字段)进行的.通常情况,某个表中的字段比较多,可以新建立一张“扩展表”,将不经常使用或者长度较大的字段拆分出去放到“扩展表”中,如下图所示: 小结 在字段很多的情况下,拆分开确实更便于开发和维护,