mysql 如何给已有表分区

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql 如何给已有表分区相关的知识,希望对你有一定的参考价值。

由于之前没有想到数据量会越来越大,没有建立分区,查询速度越来越慢,我想建立一个像Oracle式的range分区来优化表,但是表已经存在,怎么在已有数据的表的基础上建立分区来优化查询速度?

我也在找方法 mysql自从5.1开始就可以表分区了。 参考技术A mysql没有表分区概念,oracle才有表分区! 参考技术B 不知道你说的分区是什么意思? 还是没有搞明白 请说的明白点好么? 参考技术C 试一下 alert命令

MySQL对数据表已有表进行分区表

1.由于数据量较大,对现有的表进行分区

操作方式.
可以使用ALTER TABLE来进行更改表为分区表,这个操作会创建一个分区表,然后自动进行数据copy然后删除原表,
猜测服务器资源消耗比较大。

ALTER TABLE tbl_rtdata PARTITION BY RANGE (Month(fld_date))
(
PARTITION p_Apr VALUES LESS THAN (TO_DAYS(‘2012-05-01‘)),
PARTITION p_May VALUES LESS THAN (TO_DAYS(‘2012-06-01‘)),
PARTITION p_Dec VALUES LESS THAN MAXVALUE );
**

2 新建一个和原来表一样的分区表,然后把数据从原表导出,接着倒入新表。 **

(原来的表主键只有id,而我的分区字段是 stsdate, 这里主键要修改为 id,stsdate 联合主键,分区表要求分区字段要是主键或者是主键的一部分)

操作过程
采用第二种方案。先创建分区表,然后导出原表数据,新表名称改为原表名,然后插入,最后建立普通索引。

建立分区表

CREATE TABLE `apdailysts_p` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `ap_id` INT(11) NOT NULL,
  `mac` VARCHAR(17) NOT NULL,
  `liveinfo` LONGTEXT NOT NULL,
  `livetime` INT(11) NOT NULL,
  `stsdate` DATE NOT NULL,
  `lastmodified` DATETIME NOT NULL,
   PRIMARY KEY (`id`, `stsdate`)
) 
PARTITION BY RANGE COLUMNS(stsdate) (
    PARTITION p0 VALUES LESS THAN (‘2016-06-01‘),
    PARTITION p1 VALUES LESS THAN (‘2016-07-01‘),
    PARTITION p2 VALUES LESS THAN (‘2016-08-01‘),
    PARTITION p3 VALUES LESS THAN (‘2016-09-01‘),
    PARTITION p4 VALUES LESS THAN (‘2016-10-01‘),
    PARTITION p5 VALUES LESS THAN (‘2016-11-01‘),
    PARTITION p6 VALUES LESS THAN (‘2016-12-01‘),
    PARTITION p7 VALUES LESS THAN (‘2017-01-01‘),
    PARTITION p8 VALUES LESS THAN (‘2017-02-01‘),
    PARTITION p9 VALUES LESS THAN (‘2017-03-01‘),
    PARTITION p10 VALUES LESS THAN (‘2017-05-01‘),
    PARTITION p11 VALUES LESS THAN (‘2017-06-01‘),
    PARTITION p12 VALUES LESS THAN (‘2017-07-01‘),
    PARTITION p13 VALUES LESS THAN (‘2017-08-01‘),
    PARTITION p14 VALUES LESS THAN (‘2017-09-01‘),
    PARTITION p15 VALUES LESS THAN MAXVALUE
);

导出数据

mysqldump -u dbname -p --no-create-info dbname apdailysts  > apdailysts.sql

修改表名,导入数据(10分钟就导入完了,200w, 8g多一点数据),测试下,删除原来的表。

测试可以正常使用,观察几天天。。

以上是关于mysql 如何给已有表分区的主要内容,如果未能解决你的问题,请参考以下文章

mysql分区

MySQL对数据表已有表进行分区表

mysql分区那些事

Oracle已有数据表建立表分区—在线重定义

mysql水平分表和分区有啥区别

mysql之表分区