Spec-Zone.ru › MariaDB

Статистика оптимизатора в 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 содержится столько строк.
Содержание, воспроизведенное на этом сайте, является собственностью соответствующих владельцев, и это содержание не проходит предварительной проверки MariaDB. Мнения, информация и мнения, выраженные в этом содержании, не обязательно отражают точку зрения MariaDB или любой другой стороны.

© 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/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API