Как партицировать таблицу Mysql?

D
На сайте с 28.06.2008
Offline
1101
735

Есть таблица, в которой уже 150.000 записей. В итоге будет более 1 млн.

-- Структура таблицы `btxms_assets`
--

CREATE TABLE `btxms_assets` (
`id` int(10) UNSIGNED NOT NULL COMMENT 'Primary Key',
`parent_id` int(11) NOT NULL DEFAULT '0' COMMENT 'Nested set parent.',
`lft` int(11) NOT NULL DEFAULT '0' COMMENT 'Nested set lft.',
`rgt` int(11) NOT NULL DEFAULT '0' COMMENT 'Nested set rgt.',
`level` int(10) UNSIGNED NOT NULL COMMENT 'The cached level in the nested tree.',
`name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The unique name for the asset.\n',
`title` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The descriptive title for the asset.',
`rules` varchar(5120) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'JSON encoded access control.'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

--
-- Индексы сохранённых таблиц
--

--
-- Индексы таблицы `btxms_assets`
--
ALTER TABLE `btxms_assets`
ADD PRIMARY KEY (`id`),
ADD KEY `lft` (`lft`),
ADD KEY `rgt` (`rgt`);

Уже сейчас на данном этапе тупят запросы вида

UPDATE btxms_assets
SET rgt = rgt + 2
WHERE rgt >= 109455

EXPLAIN показывает что запрос пробегает по всей таблице. Индекс на поле не помогает.

И пришла идея партицировать таблицу по блокам lft и rgt чтобы в каждой части были значения по 10.000.

Не подскажите запрос как это сделать?

edogs software
На сайте с 15.12.2005
Offline
775
#1

Что-то Вы совсем к мануальным вопросам перешли.

Во-первых https://dev.mysql.com/doc/refman/5.7/en/alter-table-partition-operations.html

Во-вторых в phpmyadmin можно задать очень удобно партиционирование.

Но по нам так ни к чему так сразу резко, начните с банального упорядочивания что-ли.

alter table btxms_assets order by rgt, lft допустим.

А вообще если Вы вот этот (видимо редко меняющийся) "хлам"


`name` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The unique name for the asset.\n',
`title` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'The descriptive title for the asset.',
`rules` varchar(5120) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT 'JSON encoded access control.'

Вынесете в отдельную таблицу (слинковав по примариИД, благо оно у вас уже есть), то Вы просто офигеете как быстро эти апдейты будут работать.

При этом и скорость работы выборок скорее всего будет выше, т.к. нужные примариИД будут выбираться быстрее, а к ним уже будет джоиниться по примариИД нужные name/title/rules.

Разработка крупных и средних проектов. Можно с криптой. Разумные цены. Хорошее качество. Адекватный подход. Продаем lenovo legion в спб, дешевле магазинов, новые, запечатанные. Есть разные. skype: edogssoft

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий