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