In diesem speziellen Fall denke ich, dass INFORMATION_SCHEMA
es sich um einen roten Hering handelt. Nach meinen eigenen SHOW COLUMNS
Leistungstests innodb_stats_on_metadata
scheint die Variable weder für MyISAM- noch für InnoDB-Tabellen einen Unterschied zu machen.
Aus dem MySQL 5.0 Handbuch ...
Einige Bedingungen verhindern die Verwendung einer temporären In-Memory-Tabelle. In diesem Fall verwendet der Server stattdessen eine On-Disk-Tabelle:
[...]
- Die Anweisungen
SHOW COLUMNS
und The DESCRIBE
werden BLOB
als Typ für einige Spalten verwendet. Daher ist die für die Ergebnisse verwendete temporäre Tabelle eine Tabelle auf der Festplatte.
Dies scheint ab MySQL 5.5 aus dem Handbuch entfernt worden zu sein, scheint aber in dieser Version immer noch zu gelten ...
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)
Die Feldinformationen mit einem Abfrageergebnis zurückgegeben enthalten die gleichen Informationen wie zurück durch SHOW COLUMNS
, so dass eine SELECT * FROM my_table LIMIT 0
dasselbe zu erreichen , soll eine On-Disk temporäre Tabelle ohne die Erstellung pro Abfrage.
Ein kurzes Beispiel, um einfach die Feldnamen in PHP zu erfassen ...
$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);
Das Abrufen von Feldinformationen auf diese Weise ist etwas umständlicher zu dekodieren. Sie müssen die Beschreibung der zugrunde liegenden MYSQL_FIELD
Struktur konsultieren , um die Datentypen und Flags abzurufen, aber sie läuft auf meinem System etwa siebenmal schneller.