zoukankan      html  css  js  c++  java
  • mysql表分区

    show variables 可以查看系统变量及其值

    show variables like '%part%';查看是否可以表分区

    show variables like '%event%' ;查看事件是否开启

    表分区的好处

    1.数据可以存放到多个磁盘上,可以存放更多数据

    2.查询的优化,按条件查询分区的数据;跨分区查询时,各个分区同时进行查询,提高了查询效率;

       跨磁盘查询,提高查询的吞吐量

    3.维护方便,可以通过删除分区来删除数据。

     分区类型

    对某个存在主键的表进行分区,

    A PRIMARY KEY must include all columns in the table's partitioning function

    ,当然了没有主键也可以进行分区

    1.RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。

    create table role
    (
    id int(20),
    name varchar(50),
    dateid int,
    PRIMARY key(id)
    )
    PARTITION by RANGE(id)(
    PARTITION p0 VALUES less than (10),
    PARTITION p1 VALUES less than (20)
    )

    上述表无法插入20以及以上的数据,添加分区p2,可以插入30以内的数据

    alter table role add PARTITION(PARTITION p2 VALUES less than (30));

    删除分区,同时会删除掉该分区的所有数据

     alter table role drop PARTITION p1

    添加一个包含其他值的分区

    alter table role add PARTITION(PARTITION p3 VALUES less than (MAXVALUE));

    2.LIST分区

    类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。

    create table itemsq
    (
    itemid int(20),
    item_name varchar(50),
    type int
    )
    PARTITION by list(type)(
    PARTITION p0 VALUES in (1,3,4,6,7),
    PARTITION p1 VALUES in (2,5,8,9,0)
    );

    list没有类型MAXVALUE的定义

     LIST分区可以和RANGE分区结合起来生成一个复合的子分区,也可以与HASH和KEY分区结合起来生成复合的子分区。

    3.hash分区

    基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。

    create table role100
    (
    id int(20),
    name varchar(50),
    dateid int
    )
    PARTITION by HASH(id%4)
    PARTITIONS 4

    4.KEY分区

    KEY 分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

    create table role10
    (
    id int(20),
    name varchar(50),
    dateid int
    )
    PARTITION by KEY(id)
    PARTITIONS 10

    当然还有其他的分区方式............

    例:

    CREATE TABLE `OnlineCount` (
      `gameid` int(10) NOT NULL DEFAULT '0',
      `writetime` datetime DEFAULT NULL,
      `daynum` int(11) NOT NULL,
      `timestr` varchar(10) NOT NULL,
      `zoneid` int(10) NOT NULL DEFAULT '0',
      `platid` int(10) NOT NULL DEFAULT '0',
      `onlinenum` int(10) NOT NULL DEFAULT '0',
      `onlineipnum` int(11) DEFAULT '0',
      PRIMARY KEY (`daynum`,`gameid`,`zoneid`,`platid`,`timestr`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8
    /*!50100 PARTITION BY RANGE (daynum)
    (PARTITION part201901 VALUES LESS THAN (20190201) ENGINE = MyISAM,
     PARTITION part201902 VALUES LESS THAN (20190301) ENGINE = MyISAM,
     PARTITION part201903 VALUES LESS THAN (20190401) ENGINE = MyISAM,
     PARTITION part201904 VALUES LESS THAN (20190501) ENGINE = MyISAM,
     PARTITION part201905 VALUES LESS THAN (20190601) ENGINE = MyISAM,
     PARTITION part201906 VALUES LESS THAN (20190701) ENGINE = MyISAM) */;

    添加分区

    if not EXISTS(
    select * from information_schema.`PARTITIONS` where TABLE_SCHEMA='zqbwebgame'
    and TABLE_NAME='OnlineCount'
    and PARTITION_NAME=CONCAT('part',DATE_FORMAT(DATE_ADD(SYSDATE(),INTERVAL 1 MONTH),'%Y%m'))
    )
    THEN
    set @partname=CONCAT('part',DATE_FORMAT(DATE_ADD(SYSDATE(),INTERVAL 1 MONTH),'%Y%m'));
    set @part=concat(DATE_FORMAT(DATE_ADD(SYSDATE(),INTERVAL 2 MONTH),'%Y%m'),'01');
    set @sqlstr=concat('alter table OnlineCount add PARTITION(PARTITION ',@partname,' VALUES less than(',@part,'))');
    PREPARE stmt1 FROM @sqlstr;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;
    end IF;

  • 相关阅读:
    启动Docker容器
    Docker 删除容器
    11.18数据库认证
    10.17权限认证
    9.16角色认证
    8.13数据库认证
    6.11Realm简介
    5.8认证流程分析
    4.7固定信息认证
    20张图表达程序员的心酸
  • 原文地址:https://www.cnblogs.com/playforever/p/8036210.html
Copyright © 2011-2022 走看看