分区和更新

时间:2012-10-17 07:54:08

标签: mysql performance partitioning

我正在越来越深入地探索MySQL功能,而我正在尝试的下一个是表分区

基本上只有一个关于他们的问题,我还没有找到一个明确的答案:

如果更新了一行,如果满足另一个分区的分区条件,该行是否会自动移动到另一个分区? (例如,如果分区按区域分割,区域从区域A变为区域B)

如果这不是自动发生的,我需要做什么才能将行从分区A移到分区B? (并且会因此而受到性能影响吗?)

我想要做的是将'已删除'(标志)信息移动到表的单独分区中,因为很少会调用它们。这通常是一个好主意,还是将所有内容放在同一个(可能是某天巨大的 - 数百万行)表中会更好?

1 个答案:

答案 0 :(得分:19)

必须在更新时移动它们。如果没有,它将无法正常工作。 MySQL必须基本扫描每个查询的所有分区,因为它无法知道存储记录的位置。

我也做过一些测试(在MySQL 5.6上,因为这是第一个可以指定要查询的分区的版本)

CREATE TABLE test (
  id int
) 
PARTITION BY RANGE (id) (
  PARTITION p1 VALUES LESS THAN (1000),
  PARTITION p2 VALUES LESS THAN MAXVALUE);

INSERT INTO test VALUES (1); -- now on partition p1

SELECT * FROM test PARTITION(p1);
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)

SELECT * FROM test PARTITION(p2);
Empty set (0.00 sec)

UPDATE test SET id = 1001; -- now on partition p2

SELECT * FROM test PARTITION (p1);
Empty set (0.00 sec)

SELECT * FROM test PARTITION (p2);
+------+
| id   |
+------+
| 1001 |
+------+
1 row in set (0.00 sec)

很明显,它在更新后立即知道该行现在位于分区p2上。