Статистика индексов
Как статистика индексов помогает оптимизатору запросов
Оптимизатор запросов MariaDB определяет лучший способ выполнения каждого запроса, в основном основываясь на деталях вовлеченных индексов.
Статистика индексов помогает принимать эти решения. Представьте, что вам нужно выбрать, где искать номер в телефонной книге или в вашей личной адресной книге. Вы бы выбрали личную адресную книгу, если это возможно, так как она (как правило!) содержит значительно меньше записей и быстрее подлежит поиску.
Теперь представьте, что вы открываете свою личную адресную книгу и обнаруживаете, что она содержит в два раза больше записей, чем телефонная книга. Ваш поиск будет медленнее. Такой же процесс применим к оптимизатору запросов, поэтому доступ к актуальной и точной статистике имеет решающее значение.
Группы значений
Статистика в основном основана на группах элементов индекса с одинаковым значением. В первичном ключе каждый индекс уникален, поэтому размер каждой группы равен единице. В неуникальном индексе у вас может быть несколько ключей с одинаковым значением. Худший пример — наличие больших групп с одинаковым значением, например, индекс по битовому полю.
MariaDB активно использует статистику среднего размера группы. Например, если есть 100 строк и двадцать групп с одинаковыми значениями индекса, средний размер группы будет равен пяти.
Однако средние значения могут искажаться крайними значениями, и виновником обычно являются значения NULL. В наборе из 100 строк может быть 19 групп со средним размером 1, в то время как остальные 81 значение — NULL. MariaDB может посчитать пять как хорошее среднее значение и выбрать использование этого индекса, а затем окажется, что необходимо прочитать 81 строку с идентичными ключами, что займет больше времени, чем альтернативный вариант.
Обработка значений NULL
Существует три основных подхода к проблеме значений NULL. Значения индекса NULL могут рассматриваться как единая группа (nulls_equal). Это обычно приемлемо, но если у вас много значений NULL, средний размер группы смещается в большую сторону, и оптимизатор может пропустить использование индекса для доступа ref, когда это было бы полезно. Это значение по умолчанию используется XtraDB/InnoDB и MyISAM. Подход nulls_unequal — это противоположный подход, где каждый NULL образует свою группу размером один. В свою очередь, средний размер группы смещается в меньшую сторону, и оптимизатор может использовать индекс для доступа ref, когда это не подходит. Это значение по умолчанию используется хранилищем Aria. Третий вариант заключается в полном игнорировании значений NULL при расчёте групп индекса.
Подходы по умолчанию могут быть изменены настройкой переменных сервера aria_stats_method, myisam_stats_method и innodb_stats_method.
Безопасные по отношению к NULL сравнения и обычные сравнения
Используемый оператор сравнения играет важную роль. Если два значения сравниваются с помощью <=> (см. null-safe-equal оператор сравнения), и оба являются NULL, возвращается 1. Если те же значения сравниваются с помощью = (см. equal оператор сравнения), возвращается NULL. Например:
SELECT 1 <=> 1, NULL <=> NULL, 1 <=> NULL; +---------+---------------+------------+ | 1 <=> 1 | NULL <=> NULL | 1 <=> NULL | +---------+---------------+------------+ | 1 | 1 | 0 | +---------+---------------+------------+ SELECT 1 = 1, NULL = NULL, 1 = NULL; +-------+-------------+----------+ | 1 = 1 | NULL = NULL | 1 = NULL | +-------+-------------+----------+ | 1 | NULL | NULL | +-------+-------------+----------+
Независимая от движка статистика
MariaDB 10.0.1 представила способ сбора статистики независимо от хранилища данных. См. Независимая от движка статистика таблиц.
Статистика на основе гистограмм
Статистика на основе гистограмм была введена в MariaDB 10.0.2 и собирается по умолчанию с MariaDB 10.4.3.
См. также
- Статистика пользователей. Этот плагин предоставляет статистику использования пользователей, клиентов, таблиц и индексов.
- Постоянная статистика InnoDB
- Независимая от движка статистика
- Статистика на основе гистограмм
- Игнорируемые индексы
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/index-statistics/