Размещение столбца с высокой кардинальностью в составных индексах с диапазонными запросами
При запросе к таблице с составным индексом, включающим условие диапазона, размещение столбцы в индексе могут существенно повлиять на производительность.
Рассмотрим файлы таблиц с первичным ключом (did, имя файла) и двумя составными индексы: INDEX(filetime, ext) и INDEX(ext, filetime). Оба индекса содержат столбец filetime, мощность которого выше, чем ext.
Запрос:
WHERE ext = '...' AND filetime BETWEEN ... AND ...
требует доступа к данным на основе как ext, так и filetime. Возникает вопрос: какой индекс оптимален для такого запроса?
Анализ
Чтобы определить оптимальный индекс, мы можем использовать FORCE INDEX и изучить планы выполнения:
-- Force range on filetime first FORCE INDEX(fe) SELECT COUNT(*), AVG(fsize) FROM files WHERE ext = 'gif' AND filetime >= '2015-01-01' AND filetime = '2015-01-01' AND filetimeВывод показывает, что INDEX(ext, filetime) (ef) имеет значительно меньшее количество строк, что указывает на более эффективное сканирование.
Трассировка оптимизатора
Для дальнейшего анализа поведения оптимизатора мы можем использовать оптимизатор трассировка:
SELECT explain_format = 'JSON'; SELECT COUNT(*), AVG(fsize) FROM files WHERE ext = 'gif' AND filetime >= '2015-01-01' AND filetimeТрассировка показывает, что оптимизатор выбирает INDEX(ext, filetime), поскольку он может использовать оба столбца индекса для фильтрации и выборки данных. Напротив, INDEX(filetime, ext) может использовать для фильтрации только первый столбец (filetime).
Выводы
На основе анализа можно сделать следующие выводы. draw:
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3