2011-08-19 20 views
5

Mam następującą strukturę tabeli z danymi w nim żyć:Konwersja do tabeli partycjonowanej

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; 

chcę przekonwertować to do partycje tabeli o następującej strukturze:

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) */; 

Jak można Czy dokonuję tej konwersji?

prostu zmieniając pierwszą linię drugiego SQL do

ALTER TABLE 'userstatistics' (

Czy to zrobić?

Przechodzenie z MySQL w wersji 5.0 do wersji 5.1.

Odpowiedz

5

Po pierwsze, musisz używać MySQL w wersji 5.1 lub nowszej. MySQL 5.0 nie obsługuje partycjonowania.

Po drugie, należy pamiętać o różnicy między pojedynczymi cudzysłowami (które ograniczają łańcuchy i daty) i zwrotnymi znacznikami (które ograniczają identyfikatory tabeli i kolumny w MySQL). W razie potrzeby użyj odpowiedniego typu. Wspominam o tym, ponieważ przykładzie użyto niewłaściwego typu cytatów:

ALTER TABLE 'userstatistics' (

które powinny być:

ALTER TABLE `userstatistics` (

Wreszcie, tak, można restrukturyzacji tabelę na partycje z ALTER TABLE. Oto dokładna kopia & pasta z oświadczeniem, że testowane na 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); 

Zauważ, że to powoduje restrukturyzacji stołowego, więc jeśli masz już dużo danych w tej tabeli, to zajmie chwilę do ucieczki. Dokładnie to, ile czasu zależy od ilości danych, prędkości sprzętu i innych czynników. Pamiętaj, że podczas restrukturyzacji stołu jest on zablokowany i nie jest dostępny do czytania i pisania przez inne zapytania.

+0

działa idealnie ... thx :) – Adam

+0

Dokumentacja krok po kroku z Billem jest zdecydowanie lepsza niż menu pomocy. :-) A ta partycja zakłada, że ​​wykonasz więcej zapytań o zakres w ciągu jednego miesiąca. –

+0

+1 dla bardzo szczegółowych informacji –

0

Look to http://dev.mysql.com/doc/refman/5.1/en/alter-table.html o alter tabeli.

Następnie w szczególności alter tabela .. ADD/DROP/COALESCE/REORGANIZE sql partycji zapewnia prawie wszystkie funkcje do zarządzania partycji.

zauważ, że hash może być użyty tylko do liczby całkowitej.

• ZMIANA TABELA ... ADD PARTITION nie tworzy tabeli tymczasowej z wyjątkiem sytuacji, gdy jest używana z tabelami NDB. Operacje ADD lub DROP dla partycji RANGE lub LIST są natychmiastowymi operacjami lub prawie takimi. Operacje ADD lub COALESCE dla partycji HASH lub KEY kopiują dane między zmienionymi partycjami; chyba że użyto LINEAR HASH lub LINEAR KEY, jest to bardzo podobne do tworzenia nowej tabeli (chociaż operacja jest wykonywana partycja po partycji). Operacja REORGANIZE kopiuje tylko zmienione partycje i nie dotyka niezmienionych.