L'intefaccia utente dell'Eliminazione Delle Tabelle
E' possibile controllare che l'Eliminazione delle Tabelle funzioni osservando l'output di EXPLAIN [EXTENDED]
, dove non sono presenti le tabelle eliminate:
MySQL [test]> explain select ACRAT_rating from actors where ACNAM_name=’Gary Oldman’; +----+--------------------+-----------+--------+---------------+---------+---------+----------------------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+--------------------+-----------+--------+---------------+---------+---------+----------------------+------+-------------+ | 1 | PRIMARY | ac_anchor | index | PRIMARY | PRIMARY | 4 | NULL | 2 | Using index | | 1 | PRIMARY | ac_name | eq_ref | PRIMARY | PRIMARY | 4 | test.ac_anchor.AC_ID | 1 | Using where | | 1 | PRIMARY | ac_rating | ref | PRIMARY | PRIMARY | 4 | test.ac_anchor.AC_ID | 1 | | | 3 | DEPENDENT SUBQUERY | sub | ref | PRIMARY | PRIMARY | 4 | test.ac_rating.AC_ID | 1 | Using index | +----+--------------------+-----------+--------+---------------+---------+---------+----------------------+------+-------------+ 4 rows in set (0.01 sec)
Si noti che la tabella ac_dob
non è presente nell'output. Ora si provi a selezionare la data di nascita:
MySQL [test]> explain select ACDOB_birthdate from actors where ACNAM_name=’Gary Oldman’; +----+-------------+-----------+--------+---------------+---------+---------+----------------------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-----------+--------+---------------+---------+---------+----------------------+------+-------------+ | 1 | PRIMARY | ac_anchor | index | PRIMARY | PRIMARY | 4 | NULL | 2 | Using index | | 1 | PRIMARY | ac_name | eq_ref | PRIMARY | PRIMARY | 4 | test.ac_anchor.AC_ID | 1 | Using where | | 1 | PRIMARY | ac_dob | eq_ref | PRIMARY | PRIMARY | 4 | test.ac_anchor.AC_ID | 1 | | +----+-------------+-----------+--------+---------------+---------+---------+----------------------+------+-------------+ 3 rows in set (0.01 sec)
La tabella ac_dob
è ora presente, mentre ac_rating
e la subquery sono sparite. Ora, si provi a selezionare solo il nome dell'attore:
MySQL [test]> explain select count(*) from actors where ACNAM_name=’Gary Oldman’; +----+-------------+-----------+--------+---------------+---------+---------+----------------------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-----------+--------+---------------+---------+---------+----------------------+------+-------------+ | 1 | PRIMARY | ac_anchor | index | PRIMARY | PRIMARY | 4 | NULL | 2 | Using index | | 1 | PRIMARY | ac_name | eq_ref | PRIMARY | PRIMARY | 4 | test.ac_anchor.AC_ID | 1 | Using where | +----+-------------+-----------+--------+---------------+---------+---------+----------------------+------+-------------+ 2 rows in set (0.01 sec)
In questo caso vengono eliminate sia ac_dob
, sia ac_rating
.
Rimuovere le tabelle da una query non la rende più lenta e non taglia fuori alcuna possibilità di ottimizzazione, perciò la Table Elimination viene eseguita sempre e non sono possibili suggerimenti per l'ottimizzatore all'interno della query.
Per scopi di debug, esiste uno switch table_elimination=on|off
, che è presente solo nelle build di debug.
Vedi anche
- Questa pagina si basa sul seguente post: http://s.petrunia.net/blog/?p=58