Команды HANDLER
Синтаксис
HANDLER tbl_name OPEN [ [AS] alias]
HANDLER tbl_name READ index_name { = | >= | <= | < } (value1,value2,...)
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ { FIRST | NEXT }
[ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name CLOSE
Описание
Команда HANDLER предоставляет прямой доступ к интерфейсам хранилища таблиц для поиска по ключу и сканирования ключа или таблицы. Она доступна для таблиц по крайней мере Aria, Memory, MyISAM и InnoDB (и должна работать с большинством «обычных» хранилищ, но не с системными таблицами, MERGE или представлениями).
HANDLER ... OPEN открывает таблицу, позволяя ей быть доступной для последующих HANDLER ... READ команд. Таблица может быть открыта с использованием псевдонима (который затем должен использоваться HANDLER ... READ, или с именем таблицы.
Объект таблицы закрывается только тогда, когда HANDLER ... CLOSE вызывается сессией и не используется другими сессиями.
Предзаготовленные запросы работают с HANDLER READ, что обеспечивает значительно более высокую производительность (ускорение на 50%), так как нет разбора, и все данные преобразуются в двоичный вид (без преобразования в текст, как в обычном протоколе).
Команда HANDLER не работает с таблицами с разбиением.
Поиск по ключу
Поиск по ключу начинается с:
HANDLER tbl_name READ index_name { = | >= | <= | < } (value,value) [LIMIT...]
Значения представляют значение каждого из столбцов ключа. Для большинства типов ключей (за исключением ключей HASH в хранилище MEMORY) вы можете использовать подмножество его столбцов.
Если вы используете LIMIT, то в случае >= или > подразумевается неявный NEXT, а если вы используете <= или <, подразумевается неявный PREV.
После начального чтения вы можете использовать
HANDLER tbl_name READ index_name NEXT [ LIMIT ... ] or HANDLER tbl_name READ index_name PREV [ LIMIT ... ]
для сканирования строк в порядке ключа.
Обратите внимание, что порядок строк не определен для ключей с дублирующими значениями и может отличаться от движка к движку.
Сканирование по ключу
Вы можете сканировать таблицу в порядке ключа, выполнив:
HANDLER tbl_name READ index_name FIRST [ LIMIT ... ] HANDLER tbl_name READ index_name NEXT [ LIMIT ... ]
или, если обработчик поддерживает обратное сканирование по ключу (большинство поддерживают):
HANDLER tbl_name READ index_name LAST [ LIMIT ... ] HANDLER tbl_name READ index_name PREV [ LIMIT ... ]
Сканирование таблицы
Вы можете сканировать таблицу в порядке строк, выполнив:
HANDLER tbl_name READ FIRST [ LIMIT ... ] HANDLER tbl_name READ NEXT [ LIMIT ... ]
Ограничения
Так как это прямой интерфейс к хранилищу, могут применяться некоторые ограничения на то, что вы можете сделать, и что произойдет, если таблица изменится. Ниже приведены некоторые из общих ограничений:
Поиск «старых строк»
HANDLER READ не является транзакционно безопасным, согласованным или атомарным. Хранилище может вернуть строки, которые существовали, когда вы начали сканирование, но которые были позже удалены. Это может произойти, так как хранилище может кэшировать строки в рамках сканирования из предыдущего чтения.
Вы также можете найти строки, добавленные после начала сканирования.
Невидимые столбцы
HANDLER ... READ также считывает данные невидимых столбцов.
Таблицы с системной версионировкой
HANDLER ... READ считывает все из таблиц с системной версионировкой, и поэтому включает row_start и row_end поля, а также все строки, которые были удалены или изменены, включая случаи использования исторических партиций.
Другие ограничения
- Если вы выполните ALTER TABLE, все ваши HANDLERы для этой таблицы автоматически закроются.
- Если вы выполните ALTER TABLE для таблицы, используемой другой подключенной сессией с HANDLER, ALTER TABLE будет ожидать закрытия HANDLER.
- Для ключей HASH вы должны использовать все части ключа при поиске строки.
- Для ключей HASH вы не можете выполнять сканирование по всем значениям ключа. Вы можете найти только все строки с одинаковым значением ключа.
- Хотя каждая команда HANDLER READ атомарна, если вы выполняете сканирование поэтапно, то некоторые движки могут выдать ошибку 1020, если таблица изменилась между командами. Обратитесь к странице обработки конкретного движка, если это произойдет.
Коды ошибок
- Ошибка 1031 (ER_ILLEGAL_HA) Хранилище таблиц для 't1' не имеет этого параметра
- Если вы получаете эту ошибку для HANDLER OPEN, это означает, что хранилище не поддерживает вызовы HANDLER.
- Если вы получаете эту ошибку для HANDLER READ, это означает, что вы пытаетесь использовать неполный ключ HASH.
- Ошибка 1020 (ER_CHECKREAD) Запись изменилась с момента последнего чтения в таблице '...'
- Это означает, что таблица изменилась между двумя чтениями, и обработчик не может обработать этот случай для данного сканирования.
См. также
© 2023 MariaDB
Licensed under the Creative Commons Attribution 3.0 Unported License and the GNU Free Documentation License.
https://mariadb.com/kb/en/handler-commands/