2013-10-14 14 views
7

Tôi có một bảng lớn lưu trữ nhiều sự kiện được theo dõi, chẳng hạn như nhấp chuột của người dùng.Phân vùng bảng MySQL theo tháng

Bảng đã có trong số 10 triệu và ngày càng tăng hàng ngày. Các truy vấn bắt đầu chậm hơn khi tôi cố gắng tìm nạp sự kiện từ khung thời gian lớn và sau khi đọc một chút về chủ đề, tôi hiểu rằng việc phân vùng bảng có thể tăng hiệu suất.

Điều tôi muốn làm là phân vùng bảng trên cơ sở mỗi tháng.

Tôi chỉ tìm thấy hướng dẫn hiển thị cách phân vùng theo cách thủ công mỗi tháng, có cách nào để chỉ cho MySQL phân vùng theo tháng và nó sẽ tự động làm điều đó không?

Nếu không, lệnh để làm điều đó theo cách thủ công xem xét phân vùng của tôi theo cột là ngày giờ là gì?

Trả lời

8

Theo giải thích của hướng dẫn: http://dev.mysql.com/doc/refman/5.6/en/partitioning-overview.html

Đây là một cách dễ dàng có thể bằng cách phân vùng hash của sản lượng tháng.

CREATE TABLE ti (id INT, amount DECIMAL(7,2), tr_date DATE) 
    ENGINE=INNODB 
    PARTITION BY HASH(MONTH(tr_date)) 
    PARTITIONS 6; 

Lưu ý rằng điều này chỉ phân vùng theo tháng và không theo năm, cũng chỉ có 6 phân vùng (ví dụ 6 phần) trong ví dụ này.

Và đối với phân vùng một bảng hiện có (thủ công: https://dev.mysql.com/doc/refman/5.7/en/alter-table-partition-operations.html):

ALTER TABLE ti 
    PARTITION BY HASH(MONTH(tr_date)) 
    PARTITIONS 6; 

Truy vấn có thể được thực hiện cả từ toàn bộ bảng:

SELECT * from ti; 

Hoặc từ phân vùng cụ thể:

SELECT * from ti PARTITION (HASH(MONTH(some_date))); 
+0

Bạn có nghĩa là khi tôi phân vùng một năm, năm tiếp theo sẽ đi đến cùng một phân vùng? – shaharmor

+2

Thật vậy, với phương pháp băm cụ thể này. Hoặc bạn có thể làm 'NĂM (tr_date) * 12 + THÁNG (tr_date)' tất nhiên – Wolph

+0

vì vậy nếu tôi muốn HASH dựa trên cả NĂM và THÁNG tôi có thể làm một cái gì đó như: 'HASH (CONCAT (YEAR (datetimefield), MONTH (datetimefield)) 'hoặc nó nên là cái gì khác? – shaharmor

-4

Sử dụng TokuDb có thời gian truy cập độc lập với kích thước bảng.

Các vấn đề liên quan