SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 01.06.2011 18:02:26

lexey2006.90
Участник
Зарегистрирован: 01.06.2011
Сообщений: 16

Партиционирование таблиц в mySQL

Добрый день! Есть вопрос по поводу партиционирования... Есть таблица весящая около 10 Гб, при сортировке - виснет сайт! решил разбить таблицу с помощью партиционирования.
CREATE TABLE orders_range (
customer_surname VARCHAR(30),
store_id INT,
salesperson_id INT,
order_date DATE,
note VARCHAR(500)
) ENGINE = MYISAM
PARTITION BY RANGE( YEAR(order_date) ) (
PARTITION p_old VALUES LESS THAN(2008),
PARTITION p_2008 VALUES LESS THAN(2009),
PARTITION p_2009 VALUES LESS THAN(MAXVALUE)
);
- партиционирование идет с помощью создания таблицы. Могу ли я не создавая таблицы (а изменяя уже созданную) разбить ее? И если это невозможно - то как мне лучше перезаписать эту таблицу с партиционированием?

Неактивен

 

#2 02.06.2011 08:52:29

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Партиционирование таблиц в mySQL

Можно и на готовой таблице:

ALTER TABLE orders_range PARTITION BY RANGE( YEAR(order_date) ) (
     PARTITION p_old VALUES LESS THAN(2008),
     PARTITION p_2008 VALUES LESS THAN(2009),
     PARTITION p_2009 VALUES LESS THAN(MAXVALUE)
  );
 


Учтите, что ALTER сначала создаст копию таблицы с партиционированием, а потом заменит ей основную, поэтому потребуется свободное место на диске для хранения копии.

Неактивен

 

#3 02.06.2011 09:35:03

lexey2006.90
Участник
Зарегистрирован: 01.06.2011
Сообщений: 16

Re: Партиционирование таблиц в mySQL

А если сначала у меня был запрос SELECT * FROM orders_range, потом мне следует обращаться к таблице (например из первого блока) как orders_range1, тогда будет ли по прежнему работать 1 запрос?

Неактивен

 

#4 02.06.2011 09:56:14

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Партиционирование таблиц в mySQL

Нет, имя таблицы останется то же. Как только ALTER выполнится, таблица с тем же именем будет с партиционированием. Временная таблица создается только на период выполнения ALTER.

Неактивен

 

#5 02.06.2011 11:17:53

lexey2006.90
Участник
Зарегистрирован: 01.06.2011
Сообщений: 16

Re: Партиционирование таблиц в mySQL

Немного не понял ответа - смогу ли я обратиться к таблице, не указываю поиск в партиции, а во всей?
И еще появился вопрос: у меня динамическая страница - могу ли я при добавлении записей создавать новую партицию, либо добавлять к уже существующей?

Неактивен

 

#6 02.06.2011 11:20:55

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Партиционирование таблиц в mySQL

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

Вы можете добавлять разделы с помощью ALTER TABLE, детали см. в документации:
http://dev.mysql.com/doc/refman/5.6/en/ … -list.html

Неактивен

 

#7 02.06.2011 11:42:55

lexey2006.90
Участник
Зарегистрирован: 01.06.2011
Сообщений: 16

Re: Партиционирование таблиц в mySQL

Спасибо, огромное, что помогаете! Могу подробно рассказать что у меня за ситуация. Есть таблица из 1 000 000 записей, в ней есть поля дата, кол-во звезд в отеле, цена и т.д. Нужно сделать так, чтобы разделить таблицу (чтобы выборка шла быстрее, т.к. щас таблица отсортирована по цене, и выбирая большую дату и кол-во звезд - они находятся в конце таблицы). Как мне это сделать?

Неактивен

 

#8 02.06.2011 11:58:53

lexey2006.90
Участник
Зарегистрирован: 01.06.2011
Сообщений: 16

Re: Партиционирование таблиц в mySQL

У меня щас таблица отсортирована по времени. При партиционировании - сохранится ли сортировка?

Неактивен

 

#9 02.06.2011 12:19:30

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Партиционирование таблиц в mySQL

Рекомендую из описания партиционирования убрать функцию YEAR, так как она будет мешать MySQL определять принадлежность. Используйте просто range по order_date. Сохранится ли сортировка не знаю, проверьте. Если нет, сделайте

ALTER TABLE orders_range ORDER BY order_date;

Неактивен

 

#10 02.06.2011 12:41:52

lexey2006.90
Участник
Зарегистрирован: 01.06.2011
Сообщений: 16

Re: Партиционирование таблиц в mySQL

Я понял так: мне надо будет разделить на партиции, например
ALTER TABLE mytable PARTITION BY RANGE ( (можете помочь с правильным синтаксисом? куда писать поле, по которму сортировать?)
PARTITION p0 VALUES LESS THAN (1990),
PARTITION p1 VALUES LESS THAN (1995),
PARTITION p2 VALUES LESS THAN (2000),
PARTITION p3 VALUES LESS THAN (2005));
А потом, при добавлении записей динамически - написать в скрипте:
ALTER TABLE tt ADD PARTITION (PARTITION p4 VALUES LESS (2007));

Неактивен

 

#11 02.06.2011 13:05:40

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Партиционирование таблиц в mySQL

PARTITION BY RANGE (order_date) (
PARTITION p0 VALUES LESS THAN ('1990-01-01'),
PARTITION p0 VALUES LESS THAN ('1995-01-01'),
PARTITION p0 VALUES LESS THAN ('2000-01-01'));

Неактивен

 

#12 02.06.2011 17:12:57

lexey2006.90
Участник
Зарегистрирован: 01.06.2011
Сообщений: 16

Re: Партиционирование таблиц в mySQL

Скажите, пожалуйста, у меня есть таблица из большого кол-ва записей, из нее идет выборка на 200 записей. Но сортируются эти записи - очень долго - как можно увеличить быстродействие?

Неактивен

 

#13 02.06.2011 20:45:07

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Партиционирование таблиц в mySQL

Добавить условия сортировки в индекс?

Неактивен

 

#14 10.06.2011 18:34:07

lexey2006.90
Участник
Зарегистрирован: 01.06.2011
Сообщений: 16

Re: Партиционирование таблиц в mySQL

Добрый день, у меня есть поле depature_date в фомате date (2011-01-01), и я хочу разделить таблицу по 6 дней в определенном периоде - правильно ли я делаю?
CREATE TABLE IF NOT EXISTS `gate_spo_price_egipt_table` (
    ->   `id` bigint(16) NOT NULL AUTO_INCREMENT,
    ->   `date_from` date NOT NULL,
    ->   `date_to` date NOT NULL,
    ->   `country` int(11) NOT NULL,
    ->   `city` int(11) NOT NULL,
    ->   `hotel` int(11) NOT NULL,
    ->   `operator` int(11) NOT NULL,
    ->   `star` int(11) NOT NULL,
    ->   `room` int(11) NOT NULL,
    ->   `pansion` int(11) NOT NULL,
    ->   `depature_from` int(11) NOT NULL,
    ->   `depature_to` int(11) NOT NULL,
    ->   `depature_date` date NOT NULL,
    ->   `days` int(11) NOT NULL,
    ->   `price` int(11) NOT NULL,
    ->   `status` tinyint(4) NOT NULL,
    ->   `chld` int(11) NOT NULL,
    ->   `age1` int(11) NOT NULL,
    ->   `age2` int(11) NOT NULL,
    ->   `age3` int(11) NOT NULL,
    ->   `age4` int(11) NOT NULL,
    ->   PRIMARY KEY (`id`,`depature_date`),
    ->   KEY `seach_gate` (`depature_date`,`room`,`days`,`status`,`operator`,`chld`,`hotel`),
    ->   KEY `seach_sort` (`price`,`depature_date`,`room`,`days`,`status`,`operator`,`chld`)
    -> ) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
    -> PARTITION BY RANGE (DAYOFYEAR(depature_date))
    -> (PARTITION p0 VALUES LESS THAN (152) ENGINE = InnoDB,
    ->  PARTITION p1 VALUES LESS THAN (158) ENGINE = InnoDB,
    ->  PARTITION p2 VALUES LESS THAN (164) ENGINE = InnoDB,
    ->  PARTITION p3 VALUES LESS THAN (170) ENGINE = InnoDB,
    ->  PARTITION p4 VALUES LESS THAN (176) ENGINE = InnoDB,
    ->  PARTITION p5 VALUES LESS THAN (181) ENGINE = InnoDB,
    ->  PARTITION p6 VALUES LESS THAN (187) ENGINE = InnoDB,
    ->  PARTITION p7 VALUES LESS THAN (194) ENGINE = InnoDB,
    ->  PARTITION p8 VALUES LESS THAN MAXVALUE ENGINE = InnoDB);

Неактивен

 

#15 09.12.2012 02:04:27

Ritm
Участник
Зарегистрирован: 09.12.2012
Сообщений: 1

Re: Партиционирование таблиц в mySQL

Здравствуйте, уважаемые специалисты. Подскажите пожалуйста, что делать? Имеется база в которой основная таблица ~85Гб слабо связанных данных.
Более 500 000 000 записей. И это то, что накопилось с декабря 2011 года! Было принято решение разбить на части (партиционировать) так чтобы каждая часть таблицы хранила данные за 2 месяца. Прочитал про ALTER TABLE <имя таблицы> PARTITION BY <имя поля>, но не совсем понял, что будет если данные продолжают добавляться?
Т.е. у меня есть поле "create_date" по которому как раз и нужно сделать разбивку. Если написать запрос вида:
ALTER TABLE table_name PARTITION BY create_date (
     PARTITION p_old VALUES LESS THAN(2011-12-01),
     PARTITION p_1 VALUES LESS THAN(2012-02-01),
     PARTITION p_2 VALUES LESS THAN(MAXVALUE)
  );
то у меня (как я понял) создастся таблица с первым разделом со всем, что было до 1 декабря 2011 года, вторым разделом с декабря по февраль и третьим со всеми остальными данными?
А как бы сделать так, чтобы один раз прочесать таблицу, разбив все на 2х месячные куски и далее чтобы каждые 2 месяца автоматически создавалась новая партиция для новых данных?
Сразу поясню: у меня куча измерительного оборудования географически распределено и постоянно пишет логи в базу. Как только пытаюсь выбрать от 10 до 50 записей из таблицы, так вешается сервер минут на 10-20. В течение этого времени никто больше ничего от сервера добиться не может и новые данные могут потеряться. запрос на выборку простейший - по ID устройства выбираю дату записи и 2 числовых параметра. Т.е. тут (в запросе на выборку) оптимизировать нечего.
Очень надеюсь на Вашу помощь ибо сам прочитав мануалы по партиционированию так и не понял, как решается именно моя проблема.

Неактивен

 

#16 09.12.2012 05:30:43

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Партиционирование таблиц в mySQL

Автоматического средства нет, можно разбить заранее наперед на много кусков. В вашем случае, если это позволит архитектура, удобнее будет просто создавать новую таблицу каждый месяц с именем, содержащим год и месяц (типа data201212). Процедура выборки усложнится, но в ряде случаев будет быстрее.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson