2011-08-19 38 views
5

Tôi có cơ cấu như sau bảng với dữ liệu trực tiếp trong đó:Chuyển đổi sang một bảng phân vùng

CREATE TABLE IF NOT EXISTS `userstatistics` (
    `user_id` int(10) unsigned NOT NULL, 
    `number_logons` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_profileminiviews` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_profilefullviews` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_mailsreceived` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_interestreceived` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_favouratesreceived` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_friendshiprequestreceived` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_imchatrequestreceived` int(7) unsigned NOT NULL DEFAULT '0', 
    `yearweek` int(6) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`user_id`,`yearweek`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

Tôi muốn chuyển đổi này vào một bảng phân vùng với cấu trúc sau:

CREATE TABLE IF NOT EXISTS `userstatistics` (
    `user_id` int(10) unsigned NOT NULL, 
    `number_logons` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_profileminiviews` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_profilefullviews` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_mailsreceived` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_interestreceived` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_favouratesreceived` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_friendshiprequestreceived` int(7) unsigned NOT NULL DEFAULT '0', 
    `number_imchatrequestreceived` int(7) unsigned NOT NULL DEFAULT '0', 
    `yearweek` int(6) unsigned NOT NULL DEFAULT '0', 
    PRIMARY KEY (`user_id`,`yearweek`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 
/*!50100 PARTITION BY RANGE (yearweek) 
(PARTITION userstats_201108 VALUES LESS THAN (201108) ENGINE = InnoDB, 
    PARTITION userstats_201109 VALUES LESS THAN (201109) ENGINE = InnoDB, 
    PARTITION userstats_201110 VALUES LESS THAN (201110) ENGINE = InnoDB, 
    PARTITION userstats_201111 VALUES LESS THAN (201111) ENGINE = InnoDB, 
    PARTITION userstats_201112 VALUES LESS THAN (201112) ENGINE = InnoDB, 
    PARTITION userstats_201113 VALUES LESS THAN (201113) ENGINE = InnoDB, 
    PARTITION userstats_201114 VALUES LESS THAN (201114) ENGINE = InnoDB, 
    PARTITION userstats_201115 VALUES LESS THAN (201115) ENGINE = InnoDB, 
    PARTITION userstats_201116 VALUES LESS THAN (201116) ENGINE = InnoDB, 
    PARTITION userstats_201117 VALUES LESS THAN (201117) ENGINE = InnoDB, 
    PARTITION userstats_201118 VALUES LESS THAN (201118) ENGINE = InnoDB, 
    PARTITION userstats_201119 VALUES LESS THAN (201119) ENGINE = InnoDB, 
    PARTITION userstats_201120 VALUES LESS THAN (201120) ENGINE = InnoDB, 
    PARTITION userstats_201121 VALUES LESS THAN (201121) ENGINE = InnoDB, 
    PARTITION userstats_max VALUES LESS THAN MAXVALUE ENGINE = InnoDB) */; 

thế nào có thể Tôi thực hiện chuyển đổi này?

Đơn giản chỉ cần thay đổi dòng đầu tiên của câu lệnh SQL thứ hai để

ALTER TABLE 'userstatistics' (

này sẽ làm điều đó?

Đi từ MySQL 5.0 đến 5.1.

Trả lời

5

Trước tiên, bạn cần chạy MySQL 5.1 trở lên. MySQL 5.0 không hỗ trợ phân vùng.

Thứ hai, hãy lưu ý sự khác biệt giữa các dấu nháy đơn (phân định các chuỗi và ngày) và các dấu sau (phân định các số nhận dạng bảng và cột trong MySQL). Sử dụng đúng loại khi thích hợp. Tôi đề cập đến điều này, vì dụ của bạn sử dụng các loại sai của dấu ngoặc kép:

ALTER TABLE 'userstatistics' (

Đó nên là:

ALTER TABLE `userstatistics` (

Cuối cùng, vâng, bạn có thể tái cấu trúc một bảng thành các phân vùng với ALTER TABLE. Dưới đây là một bản sao chính xác & dán từ một tuyên bố tôi thử nghiệm trên MySQL 5.1.57:

ALTER TABLE userstatistics PARTITION BY RANGE (yearweek) (
PARTITION userstats_201108 VALUES LESS THAN (201108) ENGINE = InnoDB, 
PARTITION userstats_201109 VALUES LESS THAN (201109) ENGINE = InnoDB, 
PARTITION userstats_201110 VALUES LESS THAN (201110) ENGINE = InnoDB, 
PARTITION userstats_201111 VALUES LESS THAN (201111) ENGINE = InnoDB, 
PARTITION userstats_201112 VALUES LESS THAN (201112) ENGINE = InnoDB, 
PARTITION userstats_201113 VALUES LESS THAN (201113) ENGINE = InnoDB, 
PARTITION userstats_201114 VALUES LESS THAN (201114) ENGINE = InnoDB, 
PARTITION userstats_201115 VALUES LESS THAN (201115) ENGINE = InnoDB, 
PARTITION userstats_201116 VALUES LESS THAN (201116) ENGINE = InnoDB, 
PARTITION userstats_201117 VALUES LESS THAN (201117) ENGINE = InnoDB, 
PARTITION userstats_201118 VALUES LESS THAN (201118) ENGINE = InnoDB, 
PARTITION userstats_201119 VALUES LESS THAN (201119) ENGINE = InnoDB, 
PARTITION userstats_201120 VALUES LESS THAN (201120) ENGINE = InnoDB, 
PARTITION userstats_201121 VALUES LESS THAN (201121) ENGINE = InnoDB, 
PARTITION userstats_max VALUES LESS THAN MAXVALUE ENGINE = InnoDB); 

Lưu ý rằng điều này gây ra một bảng cơ cấu lại, vì vậy nếu bạn đã có rất nhiều dữ liệu trong bảng này, nó sẽ mất một thời gian để chạy. Chính xác thời gian tùy thuộc vào lượng dữ liệu bạn có, tốc độ phần cứng và các yếu tố khác. Hãy lưu ý rằng trong khi bảng đang được cấu trúc lại, nó bị khóa và không có sẵn để đọc và viết bằng các truy vấn khác.

+0

hoạt động hoàn hảo ... thx :) – Adam

+0

Tài liệu từng bước của Bill chắc chắn tốt hơn menu trợ giúp. :-) Và phân vùng này giả định bạn sẽ thực hiện truy vấn nhiều hơn trong một tháng. –

+0

+1 cho thông tin rất chi tiết –

0

Look này http://dev.mysql.com/doc/refman/5.1/en/alter-table.html về thay đổi bảng.

Sau đó, đặc biệt là bảng thay đổi .. ADD/DROP/COALESCE/REORGANIZE phân vùng sql cung cấp gần như tất cả các chức năng để quản lý phân vùng của bạn.

lưu ý rằng băm chỉ có thể được sử dụng cho số nguyên.

• ALTER TABLE ... ADD PARTITION không tạo bảng tạm thời trừ khi được sử dụng với các bảng NDB. Thao tác ADD hoặc DROP cho phân vùng RANGE hoặc LIST là các hoạt động ngay lập tức hoặc gần như vậy. ADD hoặc COALESCE hoạt động cho các phân vùng HASH hoặc KEY sao chép dữ liệu giữa các phân vùng đã thay đổi; trừ khi LINEAR HASH hoặc LINEAR KEY được sử dụng, điều này cũng giống như việc tạo một bảng mới (mặc dù hoạt động được thực hiện theo phân vùng theo phân vùng). REORGANIZE hoạt động sao chép chỉ thay đổi phân vùng và không chạm vào những người không thay đổi.

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