15.2.5 Заявление 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 предоставляет прямой доступ к интерфейсам движка таблиц. Оно доступно для таблиц InnoDB и MyISAM.
Заявление HANDLER ... OPEN открывает таблицу, делая её доступной для последующих заявлений HANDLER ...
READ. Этот объект таблицы не разделяемый другими сессиями и не закрывается до тех пор, пока сессия не вызовет HANDLER ... CLOSE или пока сессия не завершится.
Если вы открываете таблицу с псевдонимом, то дальнейшие ссылки на открытую таблицу с другими заявлениями HANDLER должны использовать псевдоним, а не имя таблицы. Если вы не используете псевдоним, но открываете таблицу с именем таблицы, квалифицированным именем базы данных, то дальнейшие ссылки должны использовать неквалифицированное имя таблицы. Например, для таблицы, открытой с помощью mydb.mytable, дальнейшие ссылки должны использовать mytable.
Первый синтаксис HANDLER ... READ извлекает строку, где указанный индекс удовлетворяет заданным значениям, и выполняется условие WHERE. Если у вас индекс с несколькими столбцами, укажите значения столбцов индекса через запятую. Укажите значения для всех столбцов индекса или укажите значения для левого префикса столбцов индекса. Предположим, что индекс my_idx включает три столбца, названные col_a, col_b и col_c в указанном порядке. Заявление HANDLER может указать значения для всех трех столбцов индекса или для столбцов левого префикса. Например:
HANDLER ... READ my_idx = (col_a_val,col_b_val,col_c_val) ...
HANDLER ... READ my_idx = (col_a_val,col_b_val) ...
HANDLER ... READ my_idx = (col_a_val) ...
Для использования интерфейса HANDLER для ссылки на PRIMARY KEY таблицы используйте цитируемый идентификатор `PRIMARY`:
HANDLER tbl_name READ `PRIMARY` ...
Второй синтаксис HANDLER ... READ извлекает строку из таблицы в порядке индекса, которая соответствует условию WHERE.
Третий синтаксис HANDLER ... READ извлекает строку из таблицы в естественном порядке строк, которая соответствует условию WHERE. Он быстрее, чем HANDLER , когда требуется полное сканирование таблицы. Естественный порядок строк — это порядок, в котором строки хранятся в файле данных таблицы tbl_name READ
index_nameMyISAM. Это заявление также работает для таблиц InnoDB, но такого понятия нет, поскольку нет отдельного файла данных.
Без условия LIMIT все формы заявления HANDLER ... READ извлекают одну строку, если она доступна. Чтобы вернуть определённое количество строк, включите условие LIMIT. Оно имеет такой же синтаксис, как и для заявления SELECT. См. Раздел 15.2.13, «Заявление SELECT».
HANDLER ... CLOSE закрывает таблицу, которая была открыта с помощью HANDLER ... OPEN.
Существует несколько причин для использования интерфейса HANDLER вместо обычных заявлений SELECT:
-
HANDLERбыстрее, чемSELECT:Для
HANDLER ... OPENвыделяется выделяется выделенный обработчик движка хранения. Объект повторно используется для последующих заявленийHANDLERдля этой таблицы; его не нужно переинициализировать для каждого из них.Задействовано меньше парсинга.
Нет накладных расходов оптимизатора или проверки запросов.
Интерфейс обработчика не обязан предоставлять последовательный вид данных (например, разрешается
SELECT), поэтому движок хранения может использовать оптимизации, которыеSELECTобычно не допускает.
HANDLERупрощает портирование в приложения MySQL, использующие интерфейс низкого уровня, подобныйISAM.HANDLERпозволяет проходить по базе данных способом, который трудно (или даже невозможно) выполнить с помощьюSELECT. ИнтерфейсHANDLERявляется более естественным способом просмотра данных при работе с приложениями, предоставляющими интерактивный пользовательский интерфейс к базе данных.
HANDLER — это утверждение несколько низкого уровня. Например, оно не обеспечивает согласованность. То есть, HANDLER ... OPEN не создаёт моментальный снимок таблицы и не блокирует таблицу. Это означает, что после выполнения заявления HANDLER ...
OPEN данные таблицы могут быть изменены (текущей сессией или другими сессиями), и эти изменения могут быть только частично видимыми для сканирования HANDLER ...
NEXT или HANDLER ... PREV.
Открытый обработчик может быть закрыт и помечен для повторного открытия, в этом случае обработчик теряет свою позицию в таблице. Это происходит, когда оба следующих условия истинны:
Любая сессия выполняет
FLUSH TABLESили DDL-заявления для таблицы обработчика.Сессия, в которой открыт обработчик, выполняет не-
HANDLERзаявления, использующие таблицы.
TRUNCATE TABLE для таблицы закрывает все обработчики для таблицы, которые были открыты с помощью HANDLER OPEN.
Если таблица сброшена с помощью FLUSH
TABLES была открыта с помощью tbl_name WITH READ
LOCKHANDLER, обработчик неявно сбрасывается и теряет свою позицию.
© 2025 Oracle
Licensed under the GPLv2 License.