Spec-Zone.ru › MariaDB

MyRocks и сканирование только по индексу

Эта статья посвящена MyRocks и сканированию только по индексу на вторичных индексах. Она применима к MyRocks MariaDB, Facebook MyRocks и другим вариантам.

Только вторичные ключи

Первичный ключ в MyRocks всегда является кластеризованным ключом, то есть запись индекса является записью таблицы, и поэтому «сканирование только по индексу» невозможно, так как нет ничего, чего бы не было в паре (Ключ, Значение) первичного ключа.

Вторичные ключи могут или не могут поддерживать сканирование только по индексу, в зависимости от типов данных столбцов, которые запрашивает запрос.

Предыстория: ключи, сравнимые в памяти

Индексы MyRocks хранят «ключи, сравнимые в памяти» (то есть значения ключей сравниваются с помощью memcmp). Для некоторых типов данных легко преобразовать значение столбца в его форму, сравнимую в памяти, а для других преобразование является односторонним.

Например, в случае регистронезависимых кодировок прописные и строчные буквы считаются идентичными, т.е. 'c' = 'C'. Для некоторых типов данных MyRocks хранит дополнительные данные, которые позволяют восстановить исходное значение. (Например, для кодировки latin1_general_ci кодировки и символа 'c' он будет хранить один бит, указывающий, было ли исходное значение строчной 'c' или прописной 'C'). Однако это не работает для всех типов данных.

Поддержка сканирования только по индексу для различных типов данных

Сканирование только по индексу поддерживается для числовых и даты/времени типов данных. Для CHAR и VAR[CHAR] это зависит от используемой кодировки, см. подробности ниже.

Сканирование только по индексу в настоящее время не поддерживается для менее часто используемых типов данных, таких как

  • BIT(n)
  • SET(...)
  • ENUM(...) На самом деле, можно добавить поддержку для этих типов, не стесняйтесь написать исправление или хотя бы обосновать, почему конкретный тип данных важен

Поддержка сканирования только по индексу для различных кодировок

Что касается поддержки сканирования только по индексу, MyRocks различает три вида кодировок:

1. Бинарные (обратимые) кодировки

К ним относятся binary, latin1_bin, и utf8_bin.

Для этих кодировок возможно преобразовать значение обратно из его формы, сравнимой в памяти. Таким образом, можно восстановить исходное значение из записи индекса, и сканирование только по индексу поддерживается.

2. Восстанавливаемые кодировки

Это кодировки, где можно хранить дополнительную информацию, которая помогает восстановить исходное значение.

Критерии (из storage/rocksdb/rdb_datadic.cc, rdb_is_collation_supported()):

  • Набор символов должен использовать символы длиной 1 байт (следовательно, кодировки на основе Unicode не включены)
  • strxfrm(1 байт) = {всегда одно значение веса 1 байт}
  • нет бинарной сортировки
  • атрибут PAD

Примерами являются: latin1_general_ci, latin1_general_cs, latin1_swedish_ci, и т.д.

Сканирование только по индексу поддерживается для этих кодировок.

3. Все остальные кодировки

Для этих кодировок нет известного способа восстановить значение из его формы, сравнимой в памяти, и поэтому сканирование только по индексу не поддерживается.

MyRocks должен извлечь запись кластеризованного PK, чтобы получить значение поля.

Покрывающие запросы к вторичным ключам для VARCHAR

TODO: также существует эта оптимизация:

https://github.com/facebook/mysql-5.6/issues/303 https://github.com/facebook/mysql-5.6/commit/f349c95848e92b5b27b44f0e57194100eb0997e7

документировать это.

Содержимое, воспроизведенное на этом сайте, является собственностью его соответствующих владельцев, и это содержимое не проверяется предварительно компанией 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/myrocks-and-index-only-scans/

Spec-Zone.ru

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