mysql表分区 php_MySQL——表分区
什么是表分区
通俗地讲表分区是将一大表,根据条件分割成若干个小表。MySQL5.1开始支持数据表分区了。分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的磁盘。分区后,表面上还是一张表,但数据散列到多个位置了。程序读写的时候操作的还是大表名字,MySQL服务器自动去组织分区的数据。
表分区的优缺点
优点:
分区表的数据更容易维护,如:想批量删除大量数据可以使用清除整个分区的方式。另外,还可以对一个独立分区进行优化、检查、修复等操作。
分区表的数据可以分布在不同的物理设备上,从而高效地利用多个硬件设备
可以使用分区表来避免某些特殊的瓶颈,如:innodb的单个索引的互斥访问,ext3文件系统的inode锁竞争等。
如果需要,还可以备份和恢复独立的分区,这在非常大的数据集的场景下效果非常好。
优化查询,在where字句中包含分区列时,可以只使用必要的分区来提高查询效率,同时在涉及sum()和count()这类聚合函数的查询时,可以在每个分区上面并行处理,最终只需要汇总所有分区得到的结果。
缺点:
一个表最多只能有1024个分区(MySQL5.6之后支持8192个分区)。
在MySQL5.1中分区表达式必须是整数,或者是返回整数的表达式,在5.5之后,某些场景可以直接使用字符串列和日期类型列来进行分区(使用varchar字符串类型列时,一般还是字符串的日期作为分区)。
如果分区字段中有主键或者唯一索引列,那么所有主键列和唯一索引列都必须包含进来,如果表中有主键或唯一索引,那么分区键必须是主键或唯一索引。
分区表中无法使用外键约束。
MySQL数据库支持的分区类型为水平分区,并不支持垂直分区,因此,MySQL数据库的分区中索引是局部分区索引,一个分区中既存放了数据又存放了索引,而全局分区是指的数据库放在各个分区中,但是所有的数据的索引放在另外一个对象中。
目前MySQL不支持空间类型和临时表类型进行分区,不支持全文索引。
分区类型
RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。
LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。
RANGE分区
基于属于一个给定连续区间的列值,把多行分配给分区。这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义。以下是实例。
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 NOT NULL,
store_id INT NOT NULL
)
PARTITION BY RANGE (store_id) (
PARTITION p0 VALUES LESS THAN (6),
PARTITION p1 VALUES LESS THAN (11),
PARTITION p2 VALUES LESS THAN (16),
PARTITION p3 VALUES LESS THAN MAXVALUE
);
按照这种分区方案,在商店1到5工作的雇员相对应的所有行被保存在分区P0中,商店6到10的雇员保存在P1中,依次类推。MAXVALUE 表示最大的可能的整数值。现在,store_id 列值大于或等于16(定义了的最高值)的所有行都将保存在分区p3中。
LIST分区
类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
LIST分区通过使用“PARTITION BY LIST(expr)”来实现,其中“expr”是某列值或一个基于某个列值、并返回一个整数值的表达式,然后通过“VALUES IN (value_list)”的方式来定义每个分区,其中“value_list”是一个通过逗号分隔的整数列表。 注释:在MySQL 5.1中,当使用LIST分区时,有可能只能匹配整数列表。
假定有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 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 pNorth VALUES IN (3,5,6,9,17),
PARTITION pEast VALUES IN (1,2,10,11,19,20),
PARTITION pWest VALUES IN (4,12,13,14,18),
PARTITION pCentral VALUES IN (7,8,15,16)
);
需要注意的是,如果向表中插入一条"store_id"不在给定的分区的数据,比如插入一条"store_id"值为21的记录,则会插入失败。也就是说,LIST分区需要将分区字段的任何可能的值都列出来,否则无法插入记录。
HASH分区
基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
要使用HASH分区来分割一个表,要在CREATE TABLE 语句上添加一个“PARTITION BY HASH (expr)”子句,其中“expr”是一个返回一个整数的表达式。它可以仅仅是字段类型为MySQL整型的一列的名字。此外,你很可能需要在后面再添加一个“PARTITIONS num”子句,其中num是一个非负的整数,它表示表将要被分割成分区的数量。
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 HASH(store_id)
PARTITIONS 4;
KEY分区
类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL服务器提供其自身的哈希函数。必须有一列或多列包含整数值。
CREATE TABLE tk (
col1 INT NOT NULL,
col2 CHAR(5),
col3 DATE
)
PARTITION BY LINEAR KEY (col1)
PARTITIONS 3;
在KEY分区中使用关键字LINEAR和在HASH分区中使用有同样的作用,分区的编号是通过2的幂算法得到,而不是通过模数。
不懂的留言,每天一篇分享,玩转我们共同的爱好!
你也来投搞!
mysql表分区 php_MySQL——表分区相关推荐
- mysql表分区和表空间_mysql分表和分区的区别浅析
一.什么是mysql分表和分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁盘上,也可以在不同的磁盘上 二.my ...
- mysql 表分区 django_MySQL partition分区I
Mysql5.1已经发行很久了,本文根据官方文档的翻译和自己的一些测试,对Mysql分区表的局限性做了一些总结,因为个人能力以及测试环境的原因,有可能有错误的地方,还请大家看到能及时指出,当然有兴趣的 ...
- mysql分库分区分表怎么做_mysql 分区、分表、分库分表。
一,什么是mysql分表,分区 什么是分表,从表面意思上看呢,就是把一张表分成N多个小表,具体请看:mysql分表的3种方法 什么是分区,分区呢就是把一张表的数据分成N多个区块,这些区块可以在同一个磁 ...
- mysql 社区版 innodb_MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)
MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测) / -------------------- 写在最前面 ------------------ ...
- mysql 字符列做日期分区_mysql 根据日期字段做表分区
mysql 的表分区有几种类型, list, hash, range等, 今天我们介绍下日期分区, 假如与如下表: 新建mysql分区表CREATE TABLE core( core_id INT ...
- mysql 对已有表分区_mysql怎么对先有表进行分区
mysql如何对先有表进行分区? 有一张表,已经创建了,是一张普通的表,先要对这张表进行hash分区,我用一下语句创建提示错误: mysql> alter table 33 -> part ...
- mysql单表索引个数_MySQL性能:多个表与单个表和分区上的索引
小编典典 创建20,000个表是一个坏主意.您很快将需要40,000个表,然后更多. 我在<SQL反模式>一书中将此综合症称为 Metadata Tribbles .您每次计划创建&quo ...
- MySQL分库、分表、分区的区别
1.1 分 很多技术都运用了分的编程思想,这里来举几个例子,这些都是分的思想 集中式服务发展到分布式服务 从Collections.synchronizedMap(x)到1.7ConcurrentHa ...
- mysql 交换 表分区_mysql分区表分区数据和普通表交换
前言 在介绍交换分区之前,我们先了解一下 mysql 分区. 数据库的分区有两种:水平分区和垂直分区.而MySQL暂时不支持垂直分区,因此接下来说的都是水平分区.水平分区即:以行为单位对表进行分区.比 ...
最新文章
- 从经济学与市场机制中,AI可以学到什么?| 美国三院院士迈克尔乔丹教授
- 计算机二级c语言考完多久出成绩,计算机二级C语言的成绩什么时候出来?
- 如何启用用计算机iis,win7系统如何开启iis功能?电脑iis功能启用图文步骤教程...
- Office365----Project Online SKUs Change
- 9本Java程序员必读的书
- Globe宣布将在Balancer拍卖14,000,000枚GDT代币
- 更新更新,小白学面向对象方法,研一课程,附带补充C++知识
- 搞学术不完全指北【包括谷歌学术镜像、论文工具、Wiki、SCI-HUB文献下载、翻译等】
- 石灰窑计算机控制上料,石灰窑自动化控制系统
- 菱形(两种数组方法)
- JAVA经典兔子问题
- 使用 Visio 绘制卷积示意图
- 利用Excel自带的数据分析工具进行回归分析
- java iterator 转 list_JAVA Iterator 转成 List
- 如何用PS做出一张海报
- 【英语】八月英语总结
- 微服务中自定义gateway网关过滤器
- 【Docker学习总结】12.Docker守护进程的配置和操作
- 软件园十年造就核心推动力
- 基于php技术的web的网上拍卖系统