我们有一个表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)
答案 0 :(得分:0)
该表有大约36个月的数据;什么是“6个月的分区”是什么意思?也许7个分区,每个6个月?
您希望获得什么?是否有一些您认为会运行得更快的查询?请提供SHOW CREATE TABLE
(不是DESCRIBE TABLES
}和SELECT
。
然后,我会尝试说服你INDEX
,SELECT
会让PARTITION BY RANGE(TO_DAYS(LOGDATE))
的变体快速或更快地通过分区运行。
只有当我失败时才会帮助您创建分区。这是一笔交易吗?
可能只需很短的停机时间就可以创建分区(或正确索引)的表。
分区备注
http://mysql.rjweb.org/doc.php/partitionmaint
DROP
您会保留36个月的数据吗?如果是这样,我推荐38个月分区或14个季度分区。然后每月或每季度REORGANIZE
和LOGDATE
。
PK最后需要添加DROPped
。
如果您打算“归档”pt-query-digest
分区,请使用“可传输表空间”分离分区并将其转换为表格。然后转储(或其他)该表。
至于低停机时间:请查看gh-ost
和 A B
1 Null
2 Null
Null 3
Null 4
。我没有直接经验(在这种情况下),所以我必须停下来,说“任何一个工具都应该允许重建表格,只需很少的停机时间”。