Mysql表分区

时间:2017-04-15作者:klpeng分类:数据库浏览:1991评论:1

现在很多人都在谈论mysql优化,然后方案各异,各种切分,垂直水平啥的,下面我来发表一下个人看法:

mysql的优化,应该是这种顺序:


Mysql表分区

mysql数据库一般都是这个顺序去演化的,成本和复杂度也是由低到高。


下面我简单介绍一下mysql表分区:

语法(表分区分为RANGE,LIST,HASH,KEY四种类型)


创建range分区表:

CREATE TABLE lihphp (
    id INT AUTO_INCREMENT,
    nums DOUBLE NOT NULL,
    createtime DATETIME NOT NULL,
    PRIMARY KEY(id,createtime)
) ENGINE=Innodb PARTITION BY RANGE(YEAR(createtime)) (
    PARTITION p_2017 VALUES LESS THAN (2017),
    PARTITION p_2018 VALUES LESS THAN (2018),
    PARTITION p_2019 VALUES LESS THAN (2019),
    PARTITION p_all VALUES LESS THAN MAXVALUE);

这段sql表示将数据按照createtime的年份范围进行分区4个,2017年一个,2018一个,2019一个,剩下的一个,注意如果这么做,createtime必须包含在主键中。


创建hash分区表

CREATE TABLE ligphp(
    id INT PRIMARY KEY AUTO_INCREMENT,
    nums DOUBLE NOT NULL,
    createtime DATETIME NOT NULL
) ENGINE=Innodb PARTITION BY HASH(id DIV 1000000);

这段sql表示每100W条数据建立一个分区。


创建list分区表

CREATE TABLE ligphp(
    id INT PRIMARY KEY AUTO_INCREMENT,
    nums DOUBLE NOT NULL,
    createtime DATETIME NOT NULL
) ENGINE=Innodb PARTITION BY LIST(id)
(
  PARTITION p0 VALUES in(1,2,3),
  PARTITION p1 VALUES in(4,5,6)
);

这段sql表示建立2个分区,id为1,2,3的在p0分区,id为4,5,6的在p1分区,注意如果插入的记录对应的分区键的值不在list分区指定的值中,将会插入失败。


创建key分区表

CREATE TABLE ligphp(
    id INT PRIMARY KEY AUTO_INCREMENT,
    nums DOUBLE NOT NULL,
    createtime DATETIME NOT NULL
) ENGINE=Innodb PARTITION BY KEY(id)
PARTITIONS 3;

这段sql表示以id为分区键(服务器使用内部哈希算法)建立3个分区,key分区的时候,exp可以为空,如果为空,则默认使用主键作为分区键,没有主键的时候,会选择非空惟一键作为分区键。


mysql的表分区,需要结合表结构作出最合理分区exp,切勿乱用,否则得不偿失,以上是基本语法,深入了解可以去mysql官方文档查阅。


原创文章如转载,请注明出处,本文首发于彭超的博客


打赏
文章版权声明:除非注明,否则均为彭超的博客原创文章,转载或复制请以超链接形式并注明出处。
相关推荐

  • 评论列表:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

猜你喜欢