15

私は MySQL の機能をどんどん深く掘り下げており、次に試しているのはテーブル パーティションです。

基本的に、それらについての質問は 1 つだけですが、まだ明確な答えを見つけることができませんでした。

行を更新する場合、別のパーティションのパーティション条件が満たされた場合、その行は自動的に別のパーティションに移動されますか? (たとえば、パーティションがリージョンごとに分割され、リージョンがリージョン 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 に答える