在现有的mysql表中进行分区

时间:2017-09-12 20:58:11

标签: mysql partitioning

我们有一个表cn_audit_log。我们考虑分区。我们喜欢用LOGDATE分区6个月的数据。 什么是实现它的查询。

mysql> select count(*) from cn_audit_log;

| count(*)  |
+-----------+
| 392176871 |
+-----------+
1 row in set (26 min 39.98 sec)

cn_audit_log_overflow

+---------------------+
| max(LOGDATE)        |
+---------------------+
| 2017-09-11 11:38:52 |
+---------------------+
1 row in set (0.01 sec)

mysql> select min(LOGDATE) from cn_audit_log;

+---------------------+
| min(LOGDATE)        |
+---------------------+
| 2014-10-07 10:45:36 |


mysql> show create table cn_audit_log \G;
*************************** 1. row ***************************
       Table: cn_audit_log
Create Table: CREATE TABLE `cn_audit_log` (
  `AUDITLOGID` bigint(20) NOT NULL AUTO_INCREMENT,
  `APPID` varchar(256) DEFAULT NULL,
  `ACTIONCODE` varchar(20) NOT NULL,
  `EMAIL` varchar(128) DEFAULT NULL,
  `LOGDATE` datetime DEFAULT CURRENT_TIMESTAMP,
  `MESSAGE` varchar(512) NOT NULL,
  `PROFILEID` bigint(20) DEFAULT NULL,
  `APPVERSION` varchar(256) DEFAULT NULL,
  `ACTIONSUBCODE` varchar(50) DEFAULT NULL,
  `ADMINUSER` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`AUDITLOGID`),
  KEY `CN_AUDIT_LOG_DT_DESC` (`LOGDATE`),
  KEY `CN_AUDIT_LOG_EMAIL_IDX` (`EMAIL`,`LOGDATE`),
  KEY `CN_AUDIT_LOG_PROFILEID` (`PROFILEID`,`LOGDATE`)
) ENGINE=InnoDB AUTO_INCREMENT=879116169 DEFAULT CHARSET=latin1
1 row in set (0.03 sec)

1 个答案:

答案 0 :(得分:0)

该表有大约36个月的数据;什么是“6个月的分区”是什么意思?也许7个分区,每个6个月?

您希望获得什么?是否有一些您认为会运行得更快的查询?请提供SHOW CREATE TABLE(不是DESCRIBE TABLES}和SELECT

然后,我会尝试说服你INDEXSELECT会让PARTITION BY RANGE(TO_DAYS(LOGDATE))的变体快速或更快地通过分区运行。

只有当我失败时才会帮助您创建分区。这是一笔交易吗?

可能只需很短的停机时间就可以创建分区(或正确索引)的表。

分区备注

http://mysql.rjweb.org/doc.php/partitionmaint

DROP

您会保留36个月的数据吗?如果是这样,我推荐38个月分区或14个季度分区。然后每月或每季度REORGANIZELOGDATE

PK最后需要添加DROPped

如果您打算“归档”pt-query-digest分区,请使用“可传输表空间”分离分区并将其转换为表格。然后转储(或其他)该表。

至于低停机时间:请查看gh-ost A B 1 Null 2 Null Null 3 Null 4 。我没有直接经验(在这种情况下),所以我必须停下来,说“任何一个工具都应该允许重建表格,只需很少的停机时间”。

相关问题