1.分区分表对比
优点:
1.分区分表都能突破磁盘I/O的瓶颈,提高数据的读写速度以及扩大数据的存储数量
2.分区主要提高了磁盘的读写速度,而分表不仅提高了磁盘的读写速度,还提升了单表的并发能力
应用场景:
1.分区主要适用于访问量不大但是数据很多的表,而分表适用于访问量很大而且数据量又多的场景
难易程度:
2.分区最为简单,对程序基本上是透明的;而分表相对复杂,其中使用merge分表又最为简单,对程序透明
2.分区使用场景
1.表非常大,以至于无法全部放入内存中,或者只在表的最后部分有热点数据,其他均是历史数据
2.分区表的数据更容易维护。例如,想批量删除大量数据可以使用清楚整个分区的方式。另外,还可以对一个独立分区,进行优化,检查,修复等操作
3.分区表的数据可以分布在不同的物理设备上,从而高效率的利用多个硬件设备
4.可以使用分区表来避免某系特殊的瓶颈,例如,InnoDB的单个索引的互斥访问,ext3文件系统的inode锁竞争
5.备份和恢复独立的分区
3.分区局限
1.一个表最多只能有1024个分区
2.在5.1中,分区表达式必须是整数,或者是返回整数的表达式。在MySQL5.5中,某些场景可以直接使用列来进行分区
3.表中如果存在主键或者唯一键,则分区字段必须使用主键或者唯一键;详细讲解参见:http://www.ligphp.com/post/76.html
4.分区表中无法使用外键约束
4.分区策略
1.range分区:基于一个给定的连续区间范围(区间要求连续并且不能重叠),把数据分配到不同的分区,支持分区字段为整数,但使用RANGE COLUMNS分区就支持非整数分区 创建日期分区就不需要通过函数进行转换(范围 between)
2.list分区:类似于range分区,区别在于list分区是居于枚举出的值列表分区,range是基于给定的连续区间范围分区(枚举 in)
3.hash分区:基于给定的分区个数,把数据分配到不同的分区;(hash分区其实就是取模运算,比如5%4余1所以去到p1分区,因此只支持分区字段为数字,字串则不行 to)
4.key分区:类似于hash分区,支持除text和BLOB之外的分区字段,只有指定分区数目为质数,才能保证每个分区都有数据
5.分区基础操作
1.对已有表进行分区 ALTER TABLE user PARTITION BY RANGE ( id ) ( PARTITION u0 VALUES LESS THAN ( 2 ), PARTITION u1 VALUES LESS THAN ( 3 ), PARTITION u2 VALUES LESS THAN MAXVALUE ); 2.查询分区 SELECT partition_name part, partition_expression expr, partition_description descr, FROM_DAYS( partition_description ) lessthan_sendtime, table_rows FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = SCHEMA ( ) AND TABLE_NAME = 'user';
3.创建表时分区
create table t_range(
id int(11),
money int(11) unsigned not null,
date datetime
)partition by range(year(date))( #需要通过函数进行转换
partition p2007 values less than (2008),
partition p2008 values less than (2009),
partition p2009 values less than (2010)
partition p2010 values less than maxvalue #MAXVALUE 表示最大的可能的整数值
);
4.MySQLslap数据库测试
mysqlslap
-uroot -pxxx
--concurrency=10
--iterations=10
--auto-generate-sql-load-type=read
--engine=InnoDB
--create-schema=database
--number-of-queries=10
--query='select * from xxx where xxx = 1;'