15

我对 MySQL 功能的研究越来越深入,下一个我要尝试的是表分区

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

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

如果这不会自动发生,我需要做什么才能将行从分区 A 移动到分区 B?(这样做会影响性能吗?)

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

4

1 回答 1

24

它必须在更新时移动它们。如果没有它就不会很好地工作。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 上。

于 2012-10-17T08:22:51.153 回答