Статистика оптимизатора в MyRocks
В этой статье описывается, как хранилище MyRocks предоставляет статистику для оптимизатора запросов.
Существует три типа статистики:
- Статистика таблицы (количество строк в таблице, средний размер строки)
- Кардинальность индекса (сколько различных значений находится в индексе)
- Оценки строк в диапазоне (сколько строк находится в определенном диапазоне "const1 < tbl.key < const2").
Как MyRocks вычисляет статистику
MyRocks (на самом деле RocksDB) использует файлы LSM, которые записываются один раз и никогда не обновляются. Когда файл LSM записывается, MyRocks вычисляет кардинальность индекса и количество строк для данных в файле. (Файл обычно содержит строки, записи индекса и/или метки удаления для нескольких таблиц/индексов).
По соображениям производительности статистика вычисляется на основе части строк в файле LSM. Процент используемых строк контролируется параметром rocksdb_table_stats_sampling_pct; значение по умолчанию составляет 10%.
Прежде чем данные будут записаны в файл LSM, они хранятся в MemTable. MemTable не позволяет вычислить кардинальность индекса, но может предоставить приблизительное количество строк в таблице. Использование данных MemTable для статистики контролируется параметром rocksdb_force_compute_memtable_stats; значение по умолчанию — ON.
Предсказуемы ли статистические данные индекса?
Тем, кто создает/выполняет тесты MTR, необходимо знать, является ли вывод EXPLAIN детерминированным. Для таблиц MyRocks ответ - НЕТ (как и для InnoDB).
Статистика вычисляется с помощью выборки и GetApproximateMemTableStats(), что означает, что столбец #rows в выводе EXPLAIN может незначительно изменяться.
Оценки строк в диапазоне
MyRocks использует вызов RocksDB's GetApproximateSizes() для получения оценки количества строк в определенном диапазоне. Данные в MemTable также учитываются путем вызова GetApproximateMemTableStats.
ANALYZE TABLE
ANALYZE TABLE может выполнить сброс MemTable (в зависимости от настроек rocksdb_flush_memtable_on_analyze и rocksdb_pause_background_work).
После этого он повторно прочитает статистику из файлов SST и перевычислит сводные числа (TODO: и если данные уже были на диске, результат не должен отличаться от того, что был у нас до ANALYZE?)
Переменные для отладки
Существует несколько переменных, которые заставят MyRocks сообщить оптимизатору определенные предварительно заданные значения оценки:
- @@rocksdb_records_in_range - если не 0, сообщить, что в любом диапазоне находится столько строк
- @@rocksdb_force_index_records_in_range - если не 0, и используется подсказка FORCE INDEX, сообщить, что в любом диапазоне находится столько строк.
- @@rocksdb_debug_optimizer_n_rows - если не 0, сообщить, что в любой таблице MyRocks содержится столько строк.
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/optimizer-statistics-in-myrocks/