Задавайте вопросы, мы ответим
Вы не зашли.
Добрый день! Есть вопрос по поводу партиционирования... Есть таблица весящая около 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)
);
- партиционирование идет с помощью создания таблицы. Могу ли я не создавая таблицы (а изменяя уже созданную) разбить ее? И если это невозможно - то как мне лучше перезаписать эту таблицу с партиционированием?
Неактивен
Можно и на готовой таблице:
Неактивен
А если сначала у меня был запрос SELECT * FROM orders_range, потом мне следует обращаться к таблице (например из первого блока) как orders_range1, тогда будет ли по прежнему работать 1 запрос?
Неактивен
Нет, имя таблицы останется то же. Как только ALTER выполнится, таблица с тем же именем будет с партиционированием. Временная таблица создается только на период выполнения ALTER.
Неактивен
Немного не понял ответа - смогу ли я обратиться к таблице, не указываю поиск в партиции, а во всей?
И еще появился вопрос: у меня динамическая страница - могу ли я при добавлении записей создавать новую партицию, либо добавлять к уже существующей?
Неактивен
Обращаться в запросе вы можете только к целой таблице. MySQL сам решит в каком разделе лежат данные и обратится только к необходимой части, если выборка идет по тому же ключу, что и разбиение.
Вы можете добавлять разделы с помощью ALTER TABLE, детали см. в документации:
http://dev.mysql.com/doc/refman/5.6/en/ … -list.html
Неактивен
Спасибо, огромное, что помогаете! Могу подробно рассказать что у меня за ситуация. Есть таблица из 1 000 000 записей, в ней есть поля дата, кол-во звезд в отеле, цена и т.д. Нужно сделать так, чтобы разделить таблицу (чтобы выборка шла быстрее, т.к. щас таблица отсортирована по цене, и выбирая большую дату и кол-во звезд - они находятся в конце таблицы). Как мне это сделать?
Неактивен
У меня щас таблица отсортирована по времени. При партиционировании - сохранится ли сортировка?
Неактивен
Рекомендую из описания партиционирования убрать функцию YEAR, так как она будет мешать MySQL определять принадлежность. Используйте просто range по order_date. Сохранится ли сортировка не знаю, проверьте. Если нет, сделайте
Неактивен
Я понял так: мне надо будет разделить на партиции, например
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));
Неактивен
Неактивен
Скажите, пожалуйста, у меня есть таблица из большого кол-ва записей, из нее идет выборка на 200 записей. Но сортируются эти записи - очень долго - как можно увеличить быстродействие?
Неактивен
Добавить условия сортировки в индекс?
Неактивен
Добрый день, у меня есть поле 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);
Неактивен
Здравствуйте, уважаемые специалисты. Подскажите пожалуйста, что делать? Имеется база в которой основная таблица ~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 числовых параметра. Т.е. тут (в запросе на выборку) оптимизировать нечего.
Очень надеюсь на Вашу помощь ибо сам прочитав мануалы по партиционированию так и не понял, как решается именно моя проблема.
Неактивен
Автоматического средства нет, можно разбить заранее наперед на много кусков. В вашем случае, если это позволит архитектура, удобнее будет просто создавать новую таблицу каждый месяц с именем, содержащим год и месяц (типа data201212). Процедура выборки усложнится, но в ряде случаев будет быстрее.
Неактивен