In questo caso particolare, penso che INFORMATION_SCHEMA
sia un'aringa rossa. Dai miei test sulle SHOW COLUMNS
prestazioni, la innodb_stats_on_metadata
variabile non sembra fare alcuna differenza su entrambe le tabelle MyISAM o InnoDB.
Tuttavia, dal manuale di MySQL 5.0 ...
Alcune condizioni impediscono l'uso di una tabella temporanea in memoria, nel qual caso il server utilizza invece una tabella su disco:
[...]
- Le istruzioni
SHOW COLUMNS
e The DESCRIBE
usano BLOB
come tipo per alcune colonne, quindi la tabella temporanea utilizzata per i risultati è una tabella su disco.
Questo sembra essere stato rimosso dal manuale a partire da MySQL 5.5, ma sembra ancora applicarsi in quella versione ...
mysql> SHOW VARIABLES LIKE 'version';
+---------------+-------------------------+
| Variable_name | Value |
+---------------+-------------------------+
| version | 5.5.41-0ubuntu0.14.04.1 |
+---------------+-------------------------+
1 row in set (0.00 sec)
mysql> SHOW STATUS LIKE 'Created_tmp_disk_tables';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 0 |
+-------------------------+-------+
1 row in set (0.00 sec)
mysql> SHOW COLUMNS FROM mysql.user;
[...snip...]
42 rows in set (0.00 sec)
mysql> SHOW STATUS LIKE 'Created_tmp_disk_tables';
+-------------------------+-------+
| Variable_name | Value |
+-------------------------+-------+
| Created_tmp_disk_tables | 1 |
+-------------------------+-------+
1 row in set (0.00 sec)
Le informazioni sul campo restituite con un set di risultati della query contengono le stesse informazioni restituite da SHOW COLUMNS
, pertanto è SELECT * FROM my_table LIMIT 0
necessario ottenere lo stesso risultato senza creare una tabella temporanea su disco per query.
Un breve esempio per prendere i nomi dei campi in PHP ...
$mysql = new mysqli('localhost', 'root', '', 'my_database');
$field_names = array();
$result = $mysql->query("SELECT * FROM my_table LIMIT 0");
$fields = $result->fetch_fields();
foreach ($fields as $fields)
{
$field_names[] = $field->name;
}
var_dump($field_names);
Il recupero delle informazioni sul campo in questo modo è un po 'più complicato da decodificare. Dovrai consultare la descrizione della MYSQL_FIELD
struttura sottostante per estrarre i tipi di dati e i flag, ma funziona circa 7 volte più velocemente sul mio sistema.