MySql分区
MySql从5.1版本开始支持分区,分区是指按照一定的规则,数据库把一个表分解成多个更小的,更容易管理的部分。就访问数据库的应用而言,逻辑上只有一个表或一个索引,但是实际上
这个表可能由数10个物理分区对象组成,每个分区都是一个独立的对象,可以独自处理,可以作为表的一部分进行处理。分区对应用而言是完全透明的,不影响应用的业务逻辑优点
和单个磁盘或者文件系统分区相比,可以存储更多数据
优化查询。在where子句中包含分区条件,可以只扫描必要的一个或多个分区来提高查询效率;同时在涉及SUM()和COUNT()这类聚合函数的查询时,可以容易的在每个分区上并行
处理,最终只需要汇总所有分区的结果
对于已经过期或者不需要保存的数据,可以通过删除与这些数据有关的分区来快速删除数据
跨多个磁盘来分散数据查询,以获得更大的查询吞吐量
分区有利于管理非常大的表,它采用 分而治之的逻辑,分区引入分区键的概念,分区键用于根据某个区间键,特定值列表或者HASH函数执行数据的聚集,让数据根据规则分布在不同的分区
中,让一个大对象变成一些小对象
show VARIABLES like '%partition%' 查看是否支持分区 Mysql支持大部分存储引起如MyISAM,INNODb,Memory等存储引擎,创建分区,在5.1版本中,同一个分区表的所以分区必须使用同一个存储引擎; 在同要给表上,不能对一个分区使用MyISAM引擎和Innodb引擎,但是在同一个MySQL服务器服务器上,甚至同一个数据库中,对于不同的分区表使用不同的存储引擎
分区类型
range分区:基于一个给定连续区间范围,把数据分配到不同的分区。
LIST分区:类似RANGE分区,区别在LIST分区是基于枚举出的值列表分区,RANGE是基于给定的连续区间范围分区
HASH分区:基于给定的分区个数,把数据分配到不同的分区
KEY分区:类似HASH分区
range分区 CREATE TABLE emp( id int not null, ename varchar(30), hired date not null DEFAULT '1970-01-01', separated date NOT null DEFAULT '9999-12-21', job varchar(30) not null, store_id int not null ) partition by range(store_id)( PARTITION p0 VALUES less than (10), PARTITION p1 VALUES less than (20), PARTITION p2 VALUES less than (30) ); //上述的分区方案将storid,1-9分到p0区,10-19分到p1区,等如果插入大于30,会出现错误,因为没有规则保护大于30的 INSERT into emp VALUES('2322','milk','1993-12-23','1993-12-23','click',19);//可以 //Table has no partition for value 40 INSERT into emp VALUES('2322','milk','1993-12-23','1993-12-23','click',40); 添加分区 alter table emp add partition(partition p3 values less than maxvalue); maxvalue表示最大的可能的整数值 mysql 支持在values less than 语句中加入表达式 比如以日期作为分区 CREATE TABLE emp( id int not null, ename varchar(30), hired date not null DEFAULT '1970-01-01', separated date NOT null DEFAULT '9999-12-21', job varchar(30) not null, store_id int not null ) partition by range(year(separated ))( PARTITION p0 VALUES less than (1995), PARTITION p1 VALUES less than (2000), PARTITION p2 VALUES less than (2005) ); MySQl 5.5改进了range分区给你,通过支持非整数分区,创建日期分区就不需要通过函数进行转换 partition by range(separated )( PARTITION p0 VALUES less than ('1996-01-01'), PARTITION p1 VALUES less than ('2001-01-01'), PARTITION p2 VALUES less than ('2006-01-01') );
List分区
create table expenses( expense_date date not null, category int, amount decimal(10,3) )partition by list (category)( partition p0 values in(3,5), partition p1 values in(1,10), partition p2 values in(4,9), partition p3 values in(2), partition p4 values in(6) ) LIST分区不存在类似于VALUES LESS THAN MAXVALUE这样的值 在MYSQL5.5支持非整数分区
Columns分区
create table rc3(a int,b int) parition by range columns(a,b)( parition p01 values less than(0,10), parition p01 values less than(10,10), parition p01 values less than(10,20), parition p01 values less than(maxvalue,maxvalue) )
Hash分区
create table emp(id int not null.ename varchar(30),hired date not null default '1907-01-01',sparated date null null default '8888-12-31',job varchar(30) not null, store_id int not null) partition by hash(store_id)partitions 4; 这里创建了一个常规的hash 使用 partition by hash(expr)其中expr是某列值或一个整数值的表达式返回值。 partition num 对分区类型,分区键,分区个数进行定义,上述基于 store_id列hash分区,表被分为4个分区 我们可以计算出它被保存在哪个分区中假设,假设记录的分区编号为N,那么N=MOD(expr,num),例如emp表中有4个分区,插入一个store_id为234的 mod(234,4)=2,倍保存在第二个 分区
相关推荐:
以上就是mysql基础知识 的详细内容,更多请关注php中文网其它相关文章!
……