Nesse caso em particular, acho que INFORMATION_SCHEMA
é um arenque vermelho. Nos meus próprios testes de SHOW COLUMNS
desempenho, a innodb_stats_on_metadata
variável parece não fazer diferença nas tabelas MyISAM ou InnoDB.
No entanto, no manual do MySQL 5.0 ...
Algumas condições impedem o uso de uma tabela temporária na memória; nesse caso, o servidor usa uma tabela em disco:
[...]
- As instruções
SHOW COLUMNS
e The são DESCRIBE
usadas BLOB
como o tipo para algumas colunas; portanto, a tabela temporária usada para os resultados é uma tabela em disco.
Isso parece ter sido removido do manual a partir do MySQL 5.5, mas ainda parece se aplicar nessa versão ...
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)
As informações de campo retornadas com um conjunto de resultados da consulta contêm as mesmas informações retornadas por SHOW COLUMNS
, portanto, SELECT * FROM my_table LIMIT 0
deve-se obter a mesma coisa sem criar uma tabela temporária em disco por consulta.
Um exemplo rápido para apenas pegar os nomes dos campos em 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);
Recuperar informações de campo dessa maneira é um pouco mais difícil de decodificar. Você precisará consultar a descrição da MYSQL_FIELD
estrutura subjacente para obter os tipos e sinalizadores de dados, mas ela é executada cerca de 7 vezes mais rápido no meu sistema.