我正在越来越深入地探索MySQL功能,而我正在尝试的下一个是表分区
基本上只有一个关于他们的问题,我还没有找到一个明确的答案:
如果更新了一行,如果满足另一个分区的分区条件,该行是否会自动移动到另一个分区? (例如,如果分区按区域分割,区域从区域A变为区域B)
如果这不是自动发生的,我需要做什么才能将行从分区A移到分区B? (并且会因此而受到性能影响吗?)
我想要做的是将'已删除'(标志)信息移动到表的单独分区中,因为很少会调用它们。这通常是一个好主意,还是将所有内容放在同一个(可能是某天巨大的 - 数百万行)表中会更好?
答案 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上。