Mysql PARTITION BY分区记录


前言

mysql 随着记录数的不断插入,当表记录数达到几千万的时候查询开始变慢很多,本次记录库表按月分区,前端通过时间限制来提高查询效率。


提示:以下是本篇文章正文内容,作者水平有限,下面案例仅供参考

一、数据量比较小时可以直接在原表建立分区方案

提示:将需要用来的分区的字段添加到主键

#  PRIMARY KEY (`id`,`request_time`)

ALTER TABLE tb_interface_call_log PARTITION BY RANGE COLUMNS(request_time)
(PARTITION P202206 VALUES LESS THAN ('2022-07-01') ENGINE = InnoDB,
 PARTITION P202207 VALUES LESS THAN ('2022-08-01') ENGINE = InnoDB,
 PARTITION P202208 VALUES LESS THAN ('2022-09-01') ENGINE = InnoDB,
 PARTITION P202209 VALUES LESS THAN ('2022-10-01') ENGINE = InnoDB,
 PARTITION P202210 VALUES LESS THAN ('2022-11-01') ENGINE = InnoDB,
 PARTITION P202211 VALUES LESS THAN ('2022-12-01') ENGINE = InnoDB,
 PARTITION P202212 VALUES LESS THAN ('2023-01-01') ENGINE = InnoDB,
 PARTITION p202301 VALUES LESS THAN ('2023-02-01') ENGINE = InnoDB,
 PARTITION p202302 VALUES LESS THAN ('2023-03-01') ENGINE = InnoDB,
 PARTITION p202303 VALUES LESS THAN ('2023-04-01') ENGINE = InnoDB,
 PARTITION p202304 VALUES LESS THAN ('2023-05-01') ENGINE = InnoDB,
 PARTITION p202305 VALUES LESS THAN ('2023-06-01') ENGINE = InnoDB,
 PARTITION p202306 VALUES LESS THAN ('2023-07-01') ENGINE = InnoDB);


二、表数据量已经很大,已超过千万方案

1.根据原表创建一张分区新表

SQL如下(示例):

CREATE TABLE `tb_interface_call_log_new` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `call_method_type` varchar(10),
  `call_method_uri` varchar(50),
  `call_result` int(1),
  `create_time` datetime(6) NOT NULL,
  `request_time` datetime(6) NOT NULL,
  `request_client_ip` varchar(20),
   PRIMARY KEY (`id`,`request_time`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
PARTITION BY RANGE COLUMNS(request_time) (
      PARTITION P202206 VALUES LESS THAN ('2022-07-01') ENGINE = InnoDB,
      PARTITION P202207 VALUES LESS THAN ('2022-08-01') ENGINE = InnoDB,
      PARTITION P202208 VALUES LESS THAN ('2022-09-01') ENGINE = InnoDB,
      PARTITION P202209 VALUES LESS THAN ('2022-10-01') ENGINE = InnoDB,
      PARTITION P202210 VALUES LESS THAN ('2022-11-01') ENGINE = InnoDB,
      PARTITION P202211 VALUES LESS THAN ('2022-12-01') ENGINE = InnoDB,
      PARTITION P202212 VALUES LESS THAN ('2023-01-01') ENGINE = InnoDB,
      PARTITION p202301 VALUES LESS THAN ('2023-02-01') ENGINE = InnoDB,
      PARTITION p202302 VALUES LESS THAN ('2023-03-01') ENGINE = InnoDB,
      PARTITION p202303 VALUES LESS THAN ('2023-04-01') ENGINE = InnoDB,
      PARTITION p202304 VALUES LESS THAN ('2023-05-01') ENGINE = InnoDB,
      PARTITION p202305 VALUES LESS THAN ('2023-06-01') ENGINE = InnoDB,
      PARTITION p202306 VALUES LESS THAN ('2023-07-01') ENGINE = InnoDB,
      PARTITION p202307 VALUES LESS THAN ('2023-08-01') ENGINE = InnoDB,
      PARTITION p202308 VALUES LESS THAN ('2023-09-01') ENGINE = InnoDB,
      PARTITION p202309 VALUES LESS THAN ('2023-10-01') ENGINE = InnoDB,
      PARTITION p202310 VALUES LESS THAN ('2023-11-01') ENGINE = InnoDB,
      PARTITION p202311 VALUES LESS THAN ('2023-12-01') ENGINE = InnoDB
    );


2.将数据导入到新表

SQL如下(示例):

`提示:给新表分区字段加一个索引插入很快很多`
#可以采用其他效率更高的工具,这个只是示列
INSERT INTO tb_interface_call_log_new 
SELECT * FROM tb_interface_call_log_new where request_time BETWEEN '2022-06-15 00:00:01' and '2022-07-04 00:00:00'; 

3.修改表名

SQL如下(示例):

#修改表名
ALTER TABLE tb_interface_call_log RENAME tb_interface_call_log_bak20220705;
ALTER TABLE tb_interface_call_log_new RENAME tb_interface_call_log;

结束


©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容