对表进行分区会提高性能吗?

Abd*_*naf 5 mysql innodb

我有一个非常大的表,大约 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 年做同样的事情,但这里没有做。

问题:

  1. 分区是否会提高 INSERT 和 SELECT 性能
  2. ALTER 需要多少时间,因为它是大量数据(任何方法可以最大限度地减少 Alter 时间)?
  3. 我是否需要使用在查询中创建的字段以便优化器可以使用分区?
  4. 对这张表进行分区有什么限制或风险吗?
  5. 有没有办法在不停机的情况下更改表?

Ric*_*mes 5

分区是否会提高 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。