mysql分区(和水平分表功能类似):
1. 简介:
分区和水平分表功能类似,将一个大表的数据分割到多张小表中去,由于查询不需要全表扫描了,只需要扫描某些分区,所以分区能提高查询速度.
分区是根据一定的规则,数据库把一个表分解成多个更小的、更容易管理的部分。就访问数据库应用而言,逻辑上就只有一个表或者一个索引,但实际上这个表可能有N个物理分区对象组成,每个分区都是一个独立的对象,可以独立处理,可以作为表的一部分进行处理。分区对应用来说是完全透明的,不影响应用的业务逻辑。
2. 优点:
分区有利于管理非常大的表,它采用分而治之的逻辑,分区引入了分区键的概念,分区键用于根据某个区间值(或者范围值)、特定值列表或者hash函数值执行数据的聚集,让数据根据规则分布在不同的分区中,让一个大对象变成一些小对象。
(1) 和单个磁盘或者文件系统分区相比,可以存储更多数据
(2) 优化查询。在where子句中包含分区条件时,可以只扫描必要的一个或者多个分区来提高查询效率;同时在涉及sum()和count()这类聚合函数的查询时,可以容易的在每个分区上并行处理,最终只需要汇总所有分区得到的结果
(3) 对于已经过期或者不需要保存的数据,可以通过删除与这些数据有关的分区来快速删除数据
(4) 跨多个磁盘来分散数据查询,以获得更大的查询吞吐量
3. 分区类型:
MySQL分区即可以对“数据”进行分区也可以对“索引”进行分区。
(1) range分区(常用)
(2) list分区(常用)
(3) hash分区
(4) key分区
(5) 子分区
4. 操作:
(1) 水平分表需要用户预先手动显式创建出多张分表(如tbl_user0, tbl_user1, tbl_user2),在物理上实实在在的创建多张表,通过客户端代理(Sharding-JDBC等)或者中间件代理(Mycat等)来实现分表逻辑。
(2) 分区是MySQL的一个插件Plugin功能,将一张大表的数据在数据库底层分成多个分区文件(如tbl_user#P#p0.ibd, tbl_user#P#p1.ibd, tbl_user#P#p2.ibd),和水平分表不同的是分区不需要显式的创建“分表”,数据库会自动创建分区文件的,用户看到的只是一张普通的表,其实是对应的是多个分区,这个是对用户是屏蔽的、透明的,在使用上和使用一张表完全一样,不需要借助任何功能来实现。
5. 场景:
6. 注意:
分区的字段必须是要包含在主键当中,否则报错:A PRIMARY KEY must include all columns in the table’s partitioning function;可以使用PRIMARY KEY (id,xxx)来将多个字段作为主键。
使用range分区时表结构要么没有主键,要么分区字段必须是主键。