Rechercher dans le manuel MySQL
5.6.4.2 Using the Rewriter Query Rewrite Plugin
To enable or disable the plugin, enable or disable the
rewriter_enabled
system
variable. By default, the Rewriter
plugin is
enabled when you install it (see
Section 5.6.4.1, “Installing or Uninstalling the Rewriter Query Rewrite Plugin”).
To set the initial plugin state explicitly, you can set the
variable at server startup. For example, to enable the plugin in
an option file, use these lines:
[mysqld]
rewriter_enabled=ON
It is also possible to enable or disable the plugin at runtime:
Assuming that the Rewriter
plugin is enabled,
it examines and possibly modifies each rewritable statement
received by the server. The plugin determines whether to rewrite
statements based on its in-memory cache of rewriting rules,
which are loaded from the rewrite_rules
table
in the query_rewrite
database.
These statements are subject to rewriting:
Standalone statements and prepared statements are subject to rewriting. Statements occurring within view definitions or stored programs are not subject to rewriting.
Adding Rewrite Rules
To add rules for the Rewriter
plugin, add
rows to the rewrite_rules
table, then
invoke the flush_rewrite_rules()
stored
procedure to load the rules from the table into the plugin.
The following example creates a simple rule to match
statements that select a single literal value:
The resulting table contents look like this:
The rule specifies a pattern template indicating which
SELECT
statements to match, and
a replacement template indicating how to rewrite matching
statements. However, adding the rule to the
rewrite_rules
table is not sufficient to
cause the Rewriter
plugin to use the rule.
You must invoke flush_rewrite_rules()
to
load the table contents into the plugin in-memory cache:
If your rewrite rules seem not to be working properly, make
sure that you have reloaded the rules table by calling
flush_rewrite_rules()
.
When the plugin reads each rule from the rules table, it
computes a normalized (statement digest) form from the pattern
and a digest hash value, and uses them to update the
normalized_pattern
and
pattern_digest
columns:
For information about statement digesting, normalized statements, and digest hash values, see Section 26.10, “Performance Schema Statement Digests and Sampling”.
If a rule cannot be loaded due to some error, calling
flush_rewrite_rules()
produces an error:
When this occurs, the plugin writes an error message to the
message
column of the rule row to
communicate the problem. Check the
rewrite_rules
table for rows with
non-NULL
message
column
values to see what problems exist.
Patterns use the same syntax as prepared statements (see
Section 13.5.1, “PREPARE Syntax”). Within a pattern template,
?
characters act as parameter markers that
match data values. Parameter markers can be used only where
data values should appear, not for SQL keywords, identifiers,
and so forth. The ?
characters should not
be enclosed within quotation marks.
Like the pattern, the replacement can contain
?
characters. For a statement that matches
a pattern template, the plugin rewrites it, replacing
?
parameter markers in the replacement
using data values matched by the corresponding markers in the
pattern. The result is a complete statement string. The plugin
asks the server to parse it, and returns the result to the
server as the representation of the rewritten statement.
After adding and loading the rule, check whether rewriting occurs according to whether statements match the rule pattern:
- +----------+
- +----------+
- | 3.141593 |
- +----------+
- +--------+
- | 10 + 1 |
- +--------+
- | 11 |
- +--------+
No rewriting occurs for the first
SELECT
statement, but does for
the second. The second statement illustrates that when the
Rewriter
plugin rewrites a statement, it
produces a warning message. To view the message, use
SHOW WARNINGS
:
- *************************** 1. row ***************************
- Level: Note
- Code: 1105
A statement need not be rewritten to a statement of the same
type. The following example loads a rule that rewrites
DELETE
statements to
UPDATE
statements:
- 'UPDATE db1.t1 SET col = NULL WHERE col = ?');
To enable or disable an existing rule, modify its
enabled
column and reload the table into
the plugin. To disable rule 1:
This enables you to deactivate a rule without removing it from the table.
To re-enable rule 1:
The rewrite_rules
table contains a
pattern_database
column that
Rewriter
uses for matching table names that
are not qualified with a database name:
Qualified table names in statements match qualified names in the pattern if corresponding database and table names are identical.
Unqualified table names in statements match unqualified names in the pattern only if the default database is the same as
pattern_database
and the table names are identical.
Suppose that a table named appdb.users
has
a column named id
and that applications are
expected to select rows from the table using a query of one of
these forms, where the second can be used only if
appdb
is the default database:
Suppose also that the id
column is renamed
to user_id
(perhaps the table must be
modified to add another type of ID and it is necessary to
indicate more specifically what type of ID the
id
column represents).
The change means that applications must refer to
user_id
rather than id
in the WHERE
clause. But if there are old
applications that cannot be written to change the
SELECT
queries they generate, they will no
longer work properly. The Rewriter
plugin
can solve this problem. To match and rewrite statements
whether or not they qualify the table name, add the following
two rules and reload the rules table:
- 'SELECT * FROM appdb.users WHERE id = ?',
- 'SELECT * FROM appdb.users WHERE user_id = ?'
- );
- 'SELECT * FROM users WHERE id = ?',
- 'SELECT * FROM users WHERE user_id = ?',
- 'appdb'
- );
Rewriter
uses the first rule to match
statements that use the qualified table name. It uses the
second to match statements that used the unqualified name, but
only if the default database is appdb
(the
value in pattern_database
).
The Rewriter
plugin uses statement digests
and digest hash values to match incoming statements against
rewrite rules in stages. The
max_digest_length
system variable
determines the size of the buffer used for computing statement
digests. Larger values enable computation of digests that
distinguish longer statements. Smaller values use less memory
but increase the likelihood of longer statements colliding
with the same digest value.
The plugin matches each statement to the rewrite rules as follows:
Compute the statement digest hash value and compare it to the rule digest hash values. This is subject to false positives, but serves as a quick rejection test.
If the statement digest hash value matches any pattern digest hash values, match the normalized (statement digest) form of the statement to the normalized form of the matching rule patterns.
If the normalized statement matches a rule, compare the literal values in the statement and the pattern. A
?
character in the pattern matches any literal value in the statement. If the statement prepares a statement,?
in the pattern also matches?
in the statement. Otherwise, corresponding literals must be the same.
If multiple rules match a statement, it is nondeterministic which one the plugin uses to rewrite the statement.
If a pattern contains more markers than the replacement, the
plugin discards excess data values. If a pattern contains
fewer markers than the replacement, it is an error. The plugin
notices this when the rules table is loaded, writes an error
message to the message
column of the rule
row to communicate the problem, and sets the
Rewriter_reload_error
status
variable to ON
.
Prepared statements are rewritten at parse time (that is, when they are prepared), not when they are executed later.
Prepared statements differ from nonprepared statements in that
they may contain ?
characters as parameter
markers. To match a ?
in a prepared
statement, a Rewriter
pattern must contain
?
in the same location. Suppose that a
rewrite rule has this pattern:
The following table shows several prepared
SELECT
statements and whether
the rule pattern matches them.
Prepared Statement | Whether Pattern Matches Statement |
---|---|
PREPARE s AS 'SELECT 3, 3' |
Yes |
PREPARE s AS 'SELECT ?, 3' |
Yes |
PREPARE s AS 'SELECT 3, ?' |
No |
PREPARE s AS 'SELECT ?, ?' |
No |
The Rewriter
plugin makes information
available about its operation by means of several status
variables:
- +-----------------------------------+-------+
- +-----------------------------------+-------+
- | Rewriter_number_loaded_rules | 1 |
- | Rewriter_number_reloads | 5 |
- | Rewriter_number_rewritten_queries | 1 |
- +-----------------------------------+-------+
For descriptions of these variables, see Section 5.6.4.3.4, “Rewriter Query Rewrite Plugin Status Variables”.
When you load the rules table by calling the
flush_rewrite_rules()
stored procedure, if
an error occurs for some rule, the CALL
statement produces an error, and the plugin sets the
Rewriter_reload_error
status variable to
ON
:
- +-----------------------+-------+
- +-----------------------+-------+
- +-----------------------+-------+
In this case, check the rewrite_rules
table
for rows with non-NULL
message
column values to see what problems
exist.
When the rewrite_rules
table is loaded into
the Rewriter
plugin, the plugin interprets
statements using the current global value of the
character_set_client
system
variable. If the global
character_set_client
value is
changed subsequently, the rules table must be reloaded.
A client must have a session
character_set_client
value
identical to what the global value was when the rules table
was loaded or rule matching will not work for that client.
Document created the 26/06/2006, last modified the 26/10/2018
Source of the printed document:https://www.gaudry.be/en/mysql-rf-rewriter-query-rewrite-plugin-usage.html
The infobrol is a personal site whose content is my sole responsibility. The text is available under CreativeCommons license (BY-NC-SA). More info on the terms of use and the author.
References
These references and links indicate documents consulted during the writing of this page, or which may provide additional information, but the authors of these sources can not be held responsible for the content of this page.
The author This site is solely responsible for the way in which the various concepts, and the freedoms that are taken with the reference works, are presented here. Remember that you must cross multiple source information to reduce the risk of errors.