Mysql выбирает путем автоматического увеличения первичного ключа при разделении по дате

#mysql #query-optimization #database-partitioning

#mysql #оптимизация запросов #база данных-разделение

Вопрос:

Мне было интересно, как поступит mysql, если я разделю таблицу по дате, а затем выполню несколько запросов select или update по первичному ключу?

будет ли выполняться поиск по всем разделам или оптимизатор запросов знает, в каком разделе сохранена строка?

Как насчет других уникальных и неуникальных индексированных столбцов?

Ответ №1:

Предыстория

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

Все UNIQUE ключи, включая PRIMARY KEY , должны включать «ключ раздела».

Если ключ раздела доступен в запросе, запрос сначала попытается выполнить «обрезку раздела», чтобы ограничить количество разделов для фактического просмотра. Без этой информации он должен просматривать все разделы.

После «обрезки» обработка переходит к каждому из возможных разделов и выполняет запрос.

Выберите, обновите

SELECT Логически A выполняет a UNION ALL из всего, что было найдено в не обрезанных разделах.

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

Мнение

По моему опыту, PARTITIONing часто замедляет работу из-за таких вещей, как вышеописанные. Существует небольшое количество вариантов использования для разделения: http://mysql.rjweb.org/doc.php/partitionmaint

Ваши конкретные вопросы

разделите таблицу по дате, а затем выполните несколько запросов select или update по первичному ключу?

Будут затронуты все разделы. SELECT Объединяет один результат с N-1 пустыми результатами. UPDATE Выполнит одно обновление, плюс N-1 бесполезных попыток обновления.

AUTO_INCREMENT Столбец должен быть первым столбцом в некотором индексе (не обязательно PK, не обязательно отдельно). Таким образом, использование идентификатора довольно эффективно в каждом разделе. Но это означает, что это требует в N раз больше усилий, чем в таблице без разделов. (Это снижение производительности при разделении.)