收藏本页|设为主页|RSS
LOGO

我就上乐乐吧

MySQL分区表Partition功能技术杂萃 苦逼码农的点点滴滴,请多多指教!我就上乐乐吧资源的世界,资源的海洋,收集各类资源,以无LOGO原汁原味为主!欢迎大家交流。智者乐山,仁者乐水,独乐乐,不如众乐乐,乐山,乐水,乐天,乐地,乐乐吧,乐于...

您当前的位置:首页»技术杂萃
全站公告
重要提示!

本站收集各类美图,以无LOGO原汁原味图为主!欢迎大家交流。
怕失联,请认准如下地址:
微博:http://weibo.com/237h
微信:SuperBeautylove
轻博客:http://www593668com.lofter.com/
花瓣:http://huaban.com/sinsunson
Q群号:231151757
网站:http://www.593668.com
文件解压密码:593668.com
去广告插件adblock plus安装参考:网盘下载帮助点击
网盘下载帮助请参看:网盘下载帮助点击
热心赞助

站内搜索
 
相关文章
热门文章
热搜词组
文章归档
友情链接
    MySQL分区表Partition功能

    发布日期:2019-01-15  关键词:MySQL

    MySQL的数据表是以文件的形势存在磁盘上的,默认放在/var/lib/mysql下面,也可以通过my.cnf配置文件中的datadir参数来察看具体位置。

    一张MyISAM表主要对应着三个文件,一个是frm存放表结构的,一个是MYD存放表数据的,一个是MYI存表索引的。

    如果一张表的数据量太大的话,那么MYD,MYI文件就会变的很大,这样即使有索引查找行数据也会变的很慢。这个时候就需要利用MySQL的表分区功能,在物理层面上将这一张大表对应的三个数据文件,分割成更多个小文件。这样的话,在查找一条数据时,就不用全部查找所有数据文件。只要知道这条数据大致在哪一块数据文件里,然后在那一块数据文件查找就行了。

    同样如果表的数据实在太大,可能磁盘都会被填满。这个时候,还可以把数据文件分配到不同的磁盘里面去。

    表分区是MySQL被Oracle收购后推出的一个新特性,也可以说是学习了Oracle的表分区功能。5.1开始就支持数据表分区了。

    通俗地讲,表分区就是将一大表,根据条件分割成若干个小表来存储。但在外在表现上,这些小表还是属于一个表,而不是象跟分表一样,子表完全就是独立的个体了。大家如果对分表感兴趣,可以去参看之前的文章《MySQL分表的方法》。

    当表非常大,或者表中有大量的历史记录,而“热数据”却位于表的末尾。如日志系统、新闻。。此时就可以考虑分区表。这种情况最好根据日期,也可以根据所在分类将表分区。当然如果实际业务还有其它情况,也可结合来分区。

    表分区的好处:
    1)方便把不常用的历史数据放入旧分区,可以通过删除与那些数据有关的分区,很容易地删除那些历史数据。
    2)借助于满足一个给定WHERE语句的数据可以保存在一个或多个分区内,这样在查找时就不用查找其他剩余的分区。
    3)涉及到例如SUM()和COUNT()这样聚合函数的查询,可以很容易地进行并行处理。 
    4)表分区文件可跨多个磁盘来分散数据,来获得更大的查询吞吐量。
    5)旧磁盘或文件系统分区性能不足的话,可加上新的磁盘并把热点数据放置其是以加快查询速度。

    根据所使用的不同分区规则可以分成如下类型。

    a.RANGE分区,基于属于一个给定连续区间的列值,把多行分配给分区[常用日期来做判断]。
    #用插入时间来做RANGE分区
    create table site (
      id int not null auto_increment,
      addtime DATETIME,
      name varchar(20) NOT NULL,
      url varchar(50) NOT NULL,
     Primary key (id, addtime)
    ) partition by range (TO_DAYS(addtime))(
      PARTITION p1901 VALUES LESS THAN (TO_DAYS('2019-02-01')),
      PARTITION p1902 VALUES LESS THAN (TO_DAYS('2019-03-01'))
    );
    #新增一个分区
    ALTER TABLE site ADD PARTITION(
      PARTITION p1903 VALUES LESS THAN (TO_DAYS('2019-04-01'))
    );
    #插入记录
    insert into `site` (`addtime`,`name`, `url`)values('2019-01-10 12:00:01','593668', '593668.com');
    insert into `site` (`addtime`,`name`, `url`)values('2019-02-10 12:00:01','9zfx', '9zfx.com');
    insert into `site` (`addtime`,`name`, `url`)values('2019-03-10 12:00:01','237h', '237h.com');

    b.LIST分区,主要针对集合中的某个值[如部门ID,角色ID等]。
    #用分类ID来做LIST分区
    create table site (
      id int not null auto_increment,
      catid int not null,
      name varchar(20) NOT NULL,
      url varchar(50) NOT NULL,
     Primary key (id,catid)
    ) partition by list(catid)(
      PARTITION p1 VALUES IN (1),
      PARTITION p2 VALUES IN (2)
    );
    #插入记录
    insert into `site` (`catid`,`name`, `url`)values('1','593668', '593668.com');
    insert into `site` (`catid`,`name`, `url`)values('2','9zfx', '9zfx.com');
    insert into `site` (`catid`,`name`, `url`)values('1','237h', '237h.com');

    c.HASH分区,是基于用户提供的表达式结果来进行选择的分区,可以包含MySQL中有效的、产生非负整数值的任何表达式。主要用来确保数据在预先确定数目的分区中平均分布。在RANGE和LIST分区中,必须明确指定一个给定的列值或列值集合应该保存在哪个分区中。而在HASH分区中,MySQL会自动完成这些分配,按照配置好的表达式及分区数量。
    #用id+10值来做HASH分区
    create table site (
      id int not null auto_increment,
      name varchar(20) NOT NULL,
      url varchar(50) NOT NULL,
      primary key (id)
    ) partition by hash(id+10)
    partitions 4;
    #插入记录
    insert into `site` (`name`, `url`)values('593668', '593668.com');
    insert into `site` (`name`, `url`)values('9zfx', '9zfx.com');
    insert into `site` (`name`, `url`)values('237h', '237h.com');

    d.KEY分区,类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且只能使用哈希函数,必须有一列或多列包含整数值。
    #用id值来做KEY分区
    create table site (
      id int not null auto_increment,
      name varchar(20) NOT NULL,
      url varchar(50) NOT NULL,
      primary key (id)
    ) partition by hash(id)
    partitions 4;
    #插入记录
    insert into `site` (`name`, `url`)values('593668', '593668.com');
    insert into `site` (`name`, `url`)values('9zfx', '9zfx.com');
    insert into `site` (`name`, `url`)values('237h', '237h.com');

    e.Composite分区,复合模式,基于RANGE/LIST类型的分区表中每个分区的再次分割子分区,子分区可以是HASH或KEY类型。
    #用插入时间来做RANGE分区,再用ID来做HASH分区
    create table site (
      id int not null auto_increment,
      addtime DATETIME,
      name varchar(20) NOT NULL,
      url varchar(50) NOT NULL,
      primary key (id, addtime)
    ) partition by range (TO_DAYS(addtime))
      SUBPARTITION BY HASH(id)(
      PARTITION p1901 VALUES LESS THAN (TO_DAYS('2019-02-01'))(SUBPARTITION s0,SUBPARTITION s1),
      PARTITION p1902 VALUES LESS THAN (TO_DAYS('2019-03-01'))(SUBPARTITION s2,SUBPARTITION s3)
    );
    #插入记录
    insert into `site` (`addtime`,`name`, `url`)values('2019-01-10 12:00:01','593668', '593668.com');
    insert into `site` (`addtime`,`name`, `url`)values('2019-02-10 12:00:01','9zfx', '9zfx.com');
    insert into `site` (`addtime`,`name`, `url`)values('2019-02-5 12:00:01','237h', '237h.com');

    这里有两个要注意的地方:
    I.如果创建了子分区,那么每个分区中的子分区数必须相同。
    II.同一分区内的子分区,名字必须不同,而不同分区内的子分区名字可以相同[对5.1.50不适用]

    好了,基本上的表分区操作都讲解完了,需要深入理解的话,还请自行去实操,这样才会有更深的印象。
    猜您喜欢:
    Q群:231151757微信:superimagelove官网:www.593668.com