En este caso particular, creo que INFORMATION_SCHEMA
es un arenque rojo. Según mis propias pruebas de SHOW COLUMNS
rendimiento, la innodb_stats_on_metadata
variable no parece hacer ninguna diferencia en las tablas MyISAM o InnoDB.
Sin embargo, del manual de MySQL 5.0 ...
Algunas condiciones impiden el uso de una tabla temporal en memoria, en cuyo caso el servidor usa una tabla en disco:
[...]
- Las declaraciones
SHOW COLUMNS
y The se DESCRIBE
usan BLOB
como tipo para algunas columnas, por lo tanto, la tabla temporal utilizada para los resultados es una tabla en el disco.
Esto parece haberse eliminado del manual a partir de MySQL 5.5, pero aún parece aplicarse en esa versión ...
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)
La información de campo devuelta con un conjunto de resultados de la consulta contiene la misma información que la devuelta SHOW COLUMNS
, por lo que se SELECT * FROM my_table LIMIT 0
debe lograr lo mismo sin crear una tabla temporal en disco por consulta.
Un ejemplo rápido para tomar los nombres de campo en 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 información de campo de esta manera es un poco más incómodo de decodificar. Tendrá que consultar la descripción de la MYSQL_FIELD
estructura subyacente para extraer los tipos de datos y las marcas, pero se ejecuta aproximadamente 7 veces más rápido en mi sistema.