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.