前言
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;
结束
© 版权声明
文章版权归作者所有,未经允许请勿转载。如内容涉嫌侵权,请在本页底部进入<联系我们>进行举报投诉!
THE END




















暂无评论内容