Rechercher dans le manuel MySQL
8.3.11 Optimizer Use of Generated Column Indexes
MySQL supports indexes on generated columns. For example:
The generated column, gc
, is defined as the
expression f1 + 1
. The column is also indexed
and the optimizer can take that index into account during
execution plan construction. In the following query, the
WHERE
clause refers to gc
and the optimizer considers whether the index on that column
yields a more efficient plan:
The optimizer can use indexes on generated columns to generate
execution plans, even in the absence of direct references in
queries to those columns by name. This occurs if the
WHERE
, ORDER BY
, or
GROUP BY
clause refers to an expression that
matches the definition of some indexed generated column. The
following query does not refer directly to gc
but does use an expression that matches the definition of
gc
:
The optimizer recognizes that the expression f1 +
1
matches the definition of gc
and
that gc
is indexed, so it considers that
index during execution plan construction. You can see this using
EXPLAIN
:
In effect, the optimizer has replaced the expression f1
+ 1
with the name of the generated column that matches
the expression. That is also apparent in the rewritten query
available in the extended EXPLAIN
information displayed by SHOW
WARNINGS
:
- *************************** 1. row ***************************
- Level: Note
- Code: 1003
The following restrictions and conditions apply to the optimizer's use of generated column indexes:
For a query expression to match a generated column definition, the expression must be identical and it must have the same result type. For example, if the generated column expression is
f1 + 1
, the optimizer will not recognize a match if the query uses1 + f1
, or iff1 + 1
(an integer expression) is compared with a string.The optimization applies to these operators:
=
,<
,<=
,>
,>=
,BETWEEN
, andIN()
.For operators other than
BETWEEN
andIN()
, either operand can be replaced by a matching generated column. ForBETWEEN
andIN()
, only the first argument can be replaced by a matching generated column, and the other arguments must have the same result type.BETWEEN
andIN()
are not yet supported for comparisons involving JSON values.The generated column must be defined as an expression that contains at least a function call or one of the operators mentioned in the preceding item. The expression cannot consist of a simple reference to another column. For example,
gc INT AS (f1) STORED
consists only of a column reference, so indexes ongc
are not considered.For comparisons of strings to indexed generated columns that compute a value from a JSON function that returns a quoted string,
JSON_UNQUOTE()
is needed in the column definition to remove the extra quotes from the function value. (For direct comparison of a string to the function result, the JSON comparator handles quote removal, but this does not occur for index lookups.) For example, instead of writing a column definition like this:Write it like this:
With the latter definition, the optimizer can detect a match for both of these comparisons:
Without
JSON_UNQUOTE()
in the column definition, the optimizer detects a match only for the first of those comparisons.If the optimizer picks the wrong index, an index hint can be used to disable it and force the optimizer to make a different choice.
Nederlandse vertaling
U hebt gevraagd om deze site in het Nederlands te bezoeken. Voor nu wordt alleen de interface vertaald, maar nog niet alle inhoud.Als je me wilt helpen met vertalingen, is je bijdrage welkom. Het enige dat u hoeft te doen, is u op de site registreren en mij een bericht sturen waarin u wordt gevraagd om u toe te voegen aan de groep vertalers, zodat u de gewenste pagina's kunt vertalen. Een link onderaan elke vertaalde pagina geeft aan dat u de vertaler bent en heeft een link naar uw profiel.
Bij voorbaat dank.
Document heeft de 26/06/2006 gemaakt, de laatste keer de 26/10/2018 gewijzigd
Bron van het afgedrukte document:https://www.gaudry.be/nl/mysql-rf-generated-column-index-optimizations.html
De infobrol is een persoonlijke site waarvan de inhoud uitsluitend mijn verantwoordelijkheid is. De tekst is beschikbaar onder CreativeCommons-licentie (BY-NC-SA). Meer info op de gebruiksvoorwaarden en de auteur.
Referenties
Deze verwijzingen en links verwijzen naar documenten die geraadpleegd zijn tijdens het schrijven van deze pagina, of die aanvullende informatie kunnen geven, maar de auteurs van deze bronnen kunnen niet verantwoordelijk worden gehouden voor de inhoud van deze pagina.
De auteur Deze site is als enige verantwoordelijk voor de manier waarop de verschillende concepten, en de vrijheden die met de referentiewerken worden genomen, hier worden gepresenteerd. Vergeet niet dat u meerdere broninformatie moet doorgeven om het risico op fouten te verkleinen.