未来就是现在的延续,过去就是完成的现在

MySQL 数据库表分区

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;'

 

posted @ 2019-02-22 14:46  lzj123  阅读(212)  评论(0编辑  收藏  举报