Spec-Zone .ru
спецификации, руководства, описания, API

8.9.4. Кэширование Готовых Операторов и Сохраненных Программ

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

Сервер поддерживает кэши для готовых операторов и сохраненных программ на основе на сеанс. Операторы, кэшируемые для одного сеанса, не доступны для других сеансов. Когда сеанс заканчивается, сервер отбрасывает любые операторы, кэшируемые для него.

Когда сервер использует кэшируемую внутреннюю структуру оператора, он должен заботиться, что структура не выходит из моды. Изменения метаданных могут произойти для объекта, используемого оператором, вызывая несоответствие между текущим объектным определением и определением как представлено во внутренней структуре оператора. Изменения метаданных происходят для операторов DDL, таких как те, которые создают, отбрасывают, изменяют, переименовывают, или усекают таблицы, или которые анализируют, оптимизируют, или восстанавливают таблицы. Табличные изменения контента (например, с INSERT или UPDATE) не изменяйте метаданные, ни делайте SELECT операторы.

Вот иллюстрация проблемы. Предположите, что клиент готовит этот оператор:

PREPARE s1 FROM 'SELECT * FROM t1';

SELECT * расширяется во внутренней структуре до списка столбцов в таблице. Если набор столбцов в таблице изменяется с ALTER TABLE, готовый оператор выходит из моды. Если сервер не обнаруживает это изменение в следующий раз, когда клиент выполняется s1, готовый оператор возвратит неправильные результаты.

Избегать проблем, вызванных метаданными, изменяется на таблицы или просматривает упомянутый готовым оператором, сервер обнаруживает эти изменения и автоматически повторно готовит оператор, когда это затем выполняется. Таким образом, сервер повторно анализирует оператор и восстанавливает внутреннюю структуру. Перепарсинг также происходит после того, как таблицы, на которые ссылаются, или представления сбрасываются от табличного кэша определения, или неявно чтобы создать место для новых записей в кэше, или явно из-за FLUSH TABLES.

Точно так же, если изменения происходят с объектами, используемыми сохраненной программой, пересинтаксические анализы сервера операторы, на которые влияют, в пределах программы. (Прежде, чем MySQL 5.6.6, сервер не обнаружит изменения метаданных, влияющие на сохраненные программы, таким образом, такие изменения могут вызвать неправильные результаты или ошибки.)

Сервер также обнаруживает изменения метаданных для объектов в выражениях. Они могли бы использоваться в операторах, определенных для сохраненных программ, такой как DECLARE CURSOR или операторы управления потоками такой как IF, CASE, и RETURN.

Чтобы избежать повторно анализировать все сохраненные программы, сервер повторно анализирует операторы, на которые влияют, или выражения в пределах программы только как необходимый. Примеры:

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

Попытки сервера, повторно анализирующие до трех раз. Ошибка происходит, если все попытки перестали работать.

Перепарсинг является автоматическим, но до такой степени, что он происходит, уменьшает подготовленный оператор и сохраненную производительность программы.

Для готовых операторов, Com_stmt_reprepare переменная состояния отслеживает число переприготовлений.