powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Партицирование таблиц
18 сообщений из 18, страница 1 из 1
Партицирование таблиц
    #36816150
Alexeyco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Приветствую!

Пытаюсь настроить партицирование таблицы MySQL.

Таблица с 1 внешним ключом, InnoDB. При попытке запартицировать ее как раз по внешнему ключу постоянно плюется и пишет про PRIMARY-ключ.

Если внешний ключ удаляю, то же самое абсолютно.

Что посоветуете? Т.К. данных в таблице куча кучная и притом еще часто по этой таблице идут запросы ORDER BY RANDOM()...
...
Рейтинг: 0 / 0
Партицирование таблиц
    #36816165
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покажите точную версию MySQL, тексты DDL, которые вы пытаетесь выполнить, и точные тексты сообщений об ошибках.
...
Рейтинг: 0 / 0
Партицирование таблиц
    #36816250
Alexeyco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Версия 5.1.40-community

К примеру, таблица
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
CREATE TABLE `new_table` (
  `id` int( 11 ) NOT NULL AUTO_INCREMENT,
  `dictionary_id` int( 11 ) NOT NULL,
  `native` varchar( 45 ) DEFAULT NULL,
  `studied` varchar( 45 ) DEFAULT NULL,
  UNIQUE KEY `id_idx` (`id`),
  KEY `dictionary_id_idx` (`dictionary_id`)
);

Пытаемся партицировать
Код: plaintext
[ALTER TABLE `new_table` PARTITION BY KEY(dictionary_id) PARTITIONS  1 

Получаем
A PRIMARY KEY must include all columns in the table's partitioning function
...
Рейтинг: 0 / 0
Партицирование таблиц
    #36816258
Alexeyco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Причем хочу заметить: я пробовал делать поле `id` PRIMARY... партицировать по этому признаку глупость - т.к. задача как раз разбить данные по признаку `dictionary_id` - а он не может быть PRIMARY, ведь тогда это поле должно быть UNIQUE.
...
Рейтинг: 0 / 0
Партицирование таблиц
    #36816274
Alexeyco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тогда сразу хочу заметить...

Предположим, у меня есть определенное количество словарей (dictionaries) и они могут добавляться/удаляться. Каждый словарь может содержать довольно приличное количество позиций.

Если сделать так - при добавлении/удалении словаря вызывался бы триггер, который бы перепрописывал партиции в дочернюю таблицу? Либо если триггером такое невозможно реализовать, реализовать это в программной части бизнес-логики?
...
Рейтинг: 0 / 0
Партицирование таблиц
    #36816443
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
любой уникальный индекс должен содержать столбцы, которые используются при секционировании (учите русское слово!).
то есть придется сделать UNIQUE KEY `id_idx` (`dictionary_id`,`id`),
или отказаться от уникальности.
...
Рейтинг: 0 / 0
Партицирование таблиц
    #36816545
an0nym
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexeyco,

у MySQL достаточно много ограничений на секционирование таблиц, советую почитать мануал в этой части внимательно, есть сильно неочевидные вещи.

То ограничение, которое встретилось вам, как правильно указал netwind, звучит примерно так: каждый уникальный ключ (включая PK, который является UK NOT NULL) должен содержать все колонки, используемые в выражении, по которому идет секционирование. Вызвано это тем, что в MySQL отсутствуют глобальные индексы, так как поддержание подобных индексов достаточно дорогая операция.

Иными словами, имея PK id и секционирование по полю ddate, MySQLю бы пришлось каким-то образом гарантировать, что id уникален во всех партициях сразу. Для этого нужен индекс, проходящий сквозь все секции. MySQL такого не умеет. А вот если PKем станет пара id, ddate, то достаточно, чтобы внутри каждой секции эти значения были уникальными. Так как ddate в разных секциях будет разный, то это автоматически гарантирует уникальность пары id, ddate на всей таблице.

Спасибо ораклистам, объяснившим мне это некоторое время назад .
...
Рейтинг: 0 / 0
Партицирование таблиц
    #36816724
Антон_118
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мне очень "понравилась" в свое время особенность MySQL партицирования, когда при обращении только к одной секции таблицы, эта "база" открывала файлы всех партиций. Поэтому после пары с виду безобидных запросов (к таблице с несколькими сотнями партиций), любой следующий запрос валился с "Too many open files". Помогало конечно FLUSH TABLES, но это не могло быть решением.

Поэтому в конце концов решили отказаться от секционирования вообще.

Будьте аккуратны вобщем. :)
...
Рейтинг: 0 / 0
Партицирование таблиц
    #36816782
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Антон_118"Too many open files". Помогало конечно FLUSH TABLES,
Это вообще не та проблема, которую стоит иметь ввиду. Настройте сервер нормально.
Сколько у вас был секций, сколько физических носителей и НАФИГА ?
...
Рейтинг: 0 / 0
Партицирование таблиц
    #36816797
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
аа, увидел несколько сотен.
по-моему это лишнее. Там начинаются ухудшения при большом количестве партиций.
Хотя есть ряд запросов однозначно станут лучше, если к ним просто приписать в условие WHERE ограничения, но зачем так много ?
...
Рейтинг: 0 / 0
Партицирование таблиц
    #36817165
Антон_118
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netwindаа, увидел несколько сотен.
по-моему это лишнее. Там начинаются ухудшения при большом количестве партиций.
Хотя есть ряд запросов однозначно станут лучше, если к ним просто приписать в условие WHERE ограничения, но зачем так много ?
Точнее сказать я делал 150 секций. Это совсем не много. :( Таблица с большим количеством статистической информации, параметризированная 150-ю типами статистики. Решение с секционированием отлично подходило в данном случае.

Условие WHERE на ключ секционирования использовалось и по плану видно было, что работа идет только по одной партиции. Но при этом OPEN_FILES рос очень быстро.
...
Рейтинг: 0 / 0
Партицирование таблиц
    #36817186
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Антон_118, раз уж вы от секционирования отказались, значит научились индексировать таблицы и добились того же эффекта, правильно? ну чуть-чуть cгруппируете данные по файлам и что принципиально изменилось?

вот почитайте http://www.mysqlperformanceblog.com/2009/12/05/how-many-partitions-can-you-have/
при некоторых положительных эффектах, многое ухудшается и тем сильнее, чем больше секций.

А то, что вы описываете с файлами - не проблема вовсе. Наймите такого сисадмина, который не будет разводить руками и заставлять разработчиков менять тактику, а найдет как увеличить эти лимиты.
...
Рейтинг: 0 / 0
Партицирование таблиц
    #36817236
Антон_118
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
netwind,

С секционированием select-ы работали быстрее. Но мы посчитали, что проблема с open_files хуже медленных селектов.

Скорость Insert-ов и Update-ов в нашем случае была не акутальна. Заполнение таблицы происходило один раз, а дальше только выборки.

За статью спасибо. Хороший и полезный сайт.
...
Рейтинг: 0 / 0
Партицирование таблиц
    #36817951
Alexeyco
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
С секционированием все более или менее встало на свои места. Теперь косвенный вопрос.

Дело в том, что указанная таблица, которую я хочу секционировать, будет содержать действительно большое количество записей. Я не уверен, что идея, которая мне пришла в голову, по-настоящему хорошая. Вот в чем она состоит.

Вот к примеру, в таблицу dictionaries мы добавляем новую запись (или удаляем). И я хочу в триггер прописать инструкцию по принудительному созданию партиции для указанного id нового словаря. Соответственно, при удалении словаря партиция будет удаляться.

Что скажете?
...
Рейтинг: 0 / 0
Партицирование таблиц
    #36818069
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alexeyco, ми думаем, что все попытки изобразить на процедурном mysql что-либо сложное изначально обречены.

http://dev.mysql.com/doc/refman/5.1/en/stored-program-restrictions.html

SQL Statements Not Permitted in Stored Routines
..
SQL prepared statements (PREPARE, EXECUTE, DEALLOCATE PREPARE) can be used in stored procedures, but not stored functions or triggers. Thus, stored functions and triggers cannot use dynamic SQL (where you construct statements as strings and then execute them).

это означает, что в триггере сконструировать текст формирующий эти ваши псевдополезные секции не получится никак.
...
Рейтинг: 0 / 0
Партицирование таблиц
    #36818070
netwind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
однако вы можете создать процедуру А_не_пора_ли_создать_партицию(666) и спокойно ее вызывать.
...
Рейтинг: 0 / 0
Партицирование таблиц
    #36818289
hellium
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexeycoДело в том, что указанная таблица, которую я хочу секционировать, будет содержать действительно большое количество записей. Я не уверен, что идея, которая мне пришла в голову, по-настоящему хорошая. Вот в чем она состоит.

Вот к примеру, в таблицу dictionaries мы добавляем новую запись (или удаляем). И я хочу в триггер прописать инструкцию по принудительному созданию партиции для указанного id нового словаря. Соответственно, при удалении словаря партиция будет удаляться.
Что скажете?
DDL в триггерах - зло.
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Партицирование таблиц
    #39627288
Очень подробно партицирование данных на примере БД Mysql (MariaDB) рассмотрен в статье Как обрабатывать статистику за длительный период
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Партицирование таблиц
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]