Преобразовать в секционированную таблицу - PullRequest
5 голосов
/ 20 августа 2011

У меня есть следующая структура таблицы с живыми данными в ней:

 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;

Я хочу преобразовать это в секционированную таблицу со следующей структурой:

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

Как я могусделать это преобразование?

Просто изменив первую строку второго оператора SQL на

 ALTER TABLE 'userstatistics' (

Будет ли это сделать?

Переход с MySQL 5.0 на 5.1.

Ответы [ 3 ]

6 голосов
/ 20 августа 2011

Во-первых, вам нужно запустить MySQL 5.1 или более позднюю версию. MySQL 5.0 не поддерживает разбиение.

Во-вторых, обратите внимание на разницу между одинарными кавычками (которые разделяют строки и даты) и обратными галочками (которые разделяют идентификаторы таблиц и столбцов в MySQL). Используйте правильный тип, где это уместно. Я упоминаю об этом, потому что ваш пример использует неверный тип кавычек:

ALTER TABLE 'userstatistics' (

Это должно быть:

ALTER TABLE `userstatistics` (

Наконец, да, вы можете реструктурировать таблицу в разделы с помощью ALTER TABLE. Вот точное копирование и вставка из заявления, которое я тестировал на 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);

Обратите внимание, что это вызывает реструктуризацию таблицы , поэтому, если у вас уже есть много данных в этой таблице, запуск займет некоторое время. Точно, как долго зависит от того, сколько данных у вас есть, ваша аппаратная скорость и другие факторы. Имейте в виду, что во время реструктуризации таблицы она заблокирована и недоступна для чтения и записи другими запросами.

0 голосов
/ 20 августа 2011

Посмотри это http://dev.mysql.com/doc/refman/5.1/en/alter-table.html о таблице изменений.

Затем, в частности, измените таблицу. ADD / DROP / COALESCE / REORGANIZE раздел sql предоставляет почти все функции для управления вашими разделами.

обратите внимание, что хеш можно использовать только для целых чисел.

• ALTER TABLE ... ADD PARTITION не создает временную таблицу, за исключением случаев, когда она используется с таблицами NDB. Операции ADD или DROP для разделов RANGE или LIST являются немедленными или почти немедленными. Операции ADD или COALESCE для разделов HASH или KEY копируют данные между измененными разделами; если не использовались LINEAR HASH или LINEAR KEY, это почти то же самое, что и создание новой таблицы (хотя операция выполняется по разделам). Операции REORGANIZE копируют только измененные разделы и не касаются неизмененных.

0 голосов
/ 20 августа 2011
...