我有一个非常大的表,大约 28GB,而且还在不断增加。我正在考虑对我的表进行分区。
该表是 InnoDB 并且启用了每个表的文件
我有一个字段名称created
,它是一个整数字段并存储时间戳,所以我正在考虑创建这样的表:
ALTER TABLE TABLE_NAME PARTITION BY RANGE (created)
(
PARTITION p0 VALUES LESS THAN (1325356200) ENGINE = InnoDB, # Data before 2012
PARTITION p1 VALUES LESS THAN (1333218600) ENGINE = InnoDB, # Data for JAN,FEB,MARCH YEAR 2012
PARTITION p2 VALUES LESS THAN (1341081000) ENGINE = InnoDB, # NEXT THREE MONTH DATA FOR YEAR 2012
PARTITION p3 VALUES LESS THAN (1349029800) ENGINE = InnoDB, # NEXT THREE MONTH DATA FOR YEAR 2012
PARTITION p4 VALUES LESS THAN (1356978600) ENGINE = InnoDB, # NEXT THREE MONTH DATA FOR YEAR 2012
PARTITION p5 VALUES LESS THAN MAXVALUE # DATA for Next years
) ;
Run Code Online (Sandbox Code Playgroud)
我已经将 2012 年划分为季度(因为这是我们的要求),并且也将在 2013 年做同样的事情,但这里没有做。
问题:
- 分区是否会提高 INSERT 和 SELECT 性能
- ALTER 需要多少时间,因为它是大量数据(任何方法可以最大限度地减少 Alter 时间)?
- 我是否需要使用在查询中创建的字段以便优化器可以使用分区?
- 对这张表进行分区有什么限制或风险吗?
- 有没有办法在不停机的情况下更改表?
分区是否会提高 INSERT 和 SELECT 性能
这取决于。请参阅http://mysql.rjweb.org/doc.php/ricksrots的 PARTITION 部分
ALTER 需要多少时间,因为它是大量数据(任何方法可以最大限度地减少 Alter 时间)?
ALTER(通常)花费的时间与数据大小成正比。28GB 的小时数。OTOH,ALTER PARTITION 可能要快得多。DROP PARTITION 几乎是即时的,因此对于清除“旧”数据很有用。更具体地说明您的 ALTER 问题。
我是否需要使用在查询中创建的字段以便优化器可以使用分区?
关于索引的规则可能看起来很奇怪。让我们看看 CREATE TABLE 和 SELECT(s)。
对这张表进行分区有什么限制或风险吗?
在我看来,不超过 1024 个分区,但 100 个分区“太多了”。最大的风险是你将做所有的工作来做分区,结果却得不到任何性能提升。
有没有办法在不停机的情况下更改表?
这取决于 - 特定于 ALTER。
归档时间: |
|
查看次数: |
18323 次 |
最近记录: |