2012-10-17 36 views
11

Tôi lặn sâu hơn và sâu hơn vào tính năng MySQL, và một trong những hôm sau tôi đang cố gắng ra là phân vùng bảngphân vùng và UPDATE

Có về cơ bản chỉ có một câu hỏi về họ, mà tôi không thể tìm thấy một câu trả lời rõ ràng chưa:

Nếu bạn CẬP NHẬT một hàng, hàng sẽ tự động được chuyển sang phân đoạn khác, nếu điều kiện phân vùng của phân vùng khác được đáp ứng? (ví dụ: các phân vùng được phân chia theo vùng và vùng thay đổi từ vùng A sang vùng B)

Và nếu điều đó không xảy ra tự động, tôi cần phải làm gì để di chuyển hàng phân vùng A đến phân vùng B? (và sẽ có một hit hiệu suất bằng cách làm như vậy?)

Điều tôi muốn làm là di chuyển thông tin 'đã xóa' (cờ) vào một phân vùng riêng biệt của bảng, vì chúng hiếm khi được gọi. Liệu đó có phải là một ý tưởng tốt hay tốt hơn là chỉ để lại mọi thứ trong cùng một bảng (có lẽ một ngày nào đó rất lớn - nhiều triệu hàng)?

Trả lời

17

Nó phải di chuyển chúng khi cập nhật. Nếu nó không hoạt động tốt. MySQL sẽ phải quét về cơ bản tất cả các phân vùng trên mọi truy vấn vì nó không thể biết nơi lưu trữ các bản ghi.

Tôi cũng đã làm một số xét nghiệm (trên MySQL 5.6 như đó là phiên bản đầu tiên mà nó có thể để xác định những gì partions để truy vấn)

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) 

Rõ ràng là nó lập tức sau khi cập nhật biết rằng hàng tại là trên phân vùng p2.

+1

Tôi đã hy vọng rằng nó sẽ hoạt động theo cách đó, cảm ơn! Tôi chỉ không chắc chắn vì tôi không thể nhìn thấy nó được đề cập trong tài liệu. – Katai