SHOW EXPLAIN
MariaDB starting with 10.0
The SHOW EXPLAIN
command is a new feature in MariaDB 10.0.
Contents
Spiegazione del comando
Il comando SHOW EXPLAIN
consente di ottenere l'EXPLAIN
(cioé il resoconto del piano di esecuzione) della query che un certo thread sta eseguendo.
La sintassi è:
SHOW EXPLAIN FOR <id_thread>;
Il comando produce un output come quello di EXPLAIN
per la query che il thread identificato da thread_id
sta eseguendo:
MariaDB [test]> show explain for 1; +------+-------------+-------+-------+---------------+------+---------+------+---------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+-------+-------+---------------+------+---------+------+---------+-------------+ | 1 | SIMPLE | tbl | index | NULL | a | 5 | NULL | 1000107 | Using index | +------+-------------+-------+-------+---------------+------+---------+------+---------+-------------+ 1 row in set, 1 warning (0.00 sec)
L'output è sempre accompagnato da un warning che contiene la query in esecuzione nel thread indicato (quindi chiarisce a cosa si riferisce l'EXPLAIN
):
MariaDB [test]> show warnings; +-------+------+------------------------+ | Level | Code | Message | +-------+------+------------------------+ | Note | 1003 | select sum(a) from tbl | +-------+------+------------------------+ 1 row in set (0.00 sec)
Possibili errori
L'output può essere creato solo se il thread specificato sta attualmente eseguendo una query, che ha un piano già pronto. Se non è così, l'output è il seguente:
MariaDB [test]> show explain for 2; ERROR 1932 (HY000): Target is not running an EXPLAINable command
Si ottiene questo errore se:
- il thread non sta eseguendo un comando per il quale è possibile eseguire
EXPLAIN
- il thread sta eseguendo un comando per il quale è possibile eseguire
EXPLAIN
, ma:- non c'è ancora il piano di esecuzione (per esempio, le tabelle sono aperte e i lock sono stati acquisiti prima che il piano fosse pronto)
- non c'è più il piano di esecuzione (per esempio, la query è stata scritta nei log slow/binary quando il piano era già stato cancellato).
Piani di esecuzione parziali
L'ottimizzatore di MySQL/MariaDB:
- ottimizza parti della query in modo pigro
- appena possibile cancella le parti del piano che non sono più necessarie
SHOW EXPLAIN
scrive solo le parti del piano che sono attualmente disponibili. Se una parte non è presente, nel campo Extra
si vedrà "Not yet optimized"
o "Query plan already deleted"
.
Per esempio, con questa query:
MariaDB [test]> EXPLAIN SELECT column1 + 1 FROM temp_table_view; +------+-------------+------------+------+---------------+------+---------+------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+------------+------+---------------+------+---------+------+------+-------+ | 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 2 | | | 2 | DERIVED | t1 | ALL | NULL | NULL | NULL | NULL | 2 | | +------+-------------+------------+------+---------------+------+---------+------+------+-------+ 2 rows in set (0.00 sec)
si potrebbe ottenere il seguente output:
MariaDB [test]> show explain for 1; +------+-------------+------------+------+---------------+------+---------+------+------+----------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +------+-------------+------------+------+---------------+------+---------+------+------+----------------------------+ | 1 | PRIMARY | <derived2> | ALL | NULL | NULL | NULL | NULL | 2 | | | 2 | DERIVED | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Query plan already deleted | +------+-------------+------------+------+---------------+------+---------+------+------+----------------------------+ 2 rows in set, 1 warning (0.01 sec)
Dove ottenerlo
Attualmente, questa funzionalità è presente solo nel repository di bazaar, a questo indirizzo: https://code.launchpad.net/~maria-captains/maria/5.5-show-explain
Il repository è tracciato nel buildbot di MariaDB: http://buildbot.askmonty.org/buildbot/grid?branch=5.5-show-explain
Differenze tra gli output di SHOW EXPLAIN e di EXPLAIN
Background
In MySQL, l'esecuzione di EXPLAIN
segue nel codice un percorso leggermente diverso rispetto alle query effettive (tipicamente le SELECT
). Questo è un problema, e ha causato diversi bug in EXPLAIN
. Per esempio, si vedano MDEV-326, MDEV-410 e lp:1013343. lp:992942 non riguarda direttamente EXPLAIN
, ma non sarebbe esistito se MySQL non cercasse di cancellare parti del piano nel mezzo di una query.
SHOW EXPLAIN
esamina una SELECT
in esecuzione, perciò il suo output potrebbe differire leggermente da quello di EXPLAIN SELECT
. E' stato fatto il possibile per far sì che la differenza sia lieve, o l'output di SHOW EXPLAIN
sia più fedele alla realtà rispetto a quello di EXPLAIN
.
Elenco delle differenze note
- In
SHOW EXPLAIN
potrebbe esserci Extra='no matching row in const table
', dove inEXPLAIN
ci sarebbe Extra='Impossible WHERE ...
' - Se ci sono delle subquery,
SHOW EXPLAIN
potrebbe scrivereselect_type==PRIMARY
, dove un normaleEXPLAIN
scriverebbeselect_type==SIMPLE
, o viceversa.
Permessi necessari
Per eseguire SHOW EXPLAIN
occorrono gli stessi privilegi che sono necessari per eseguire SHOW PROCESSLIST
.