#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 раз больше усилий, чем в таблице без разделов. (Это снижение производительности при разделении.)