В данном конкретном случае, я думаю, INFORMATION_SCHEMA
это красная сельдь. Судя по моим собственным тестам SHOW COLUMNS
производительности, innodb_stats_on_metadata
переменная, похоже, не имеет никакого значения для таблиц MyISAM или InnoDB.
Тем не менее, из руководства MySQL 5.0 ...
Некоторые условия не позволяют использовать временную таблицу в памяти, и в этом случае сервер использует вместо нее таблицу на диске:
[...]
- Операторы
SHOW COLUMNS
and DESCRIBE
используются BLOB
в качестве типа для некоторых столбцов, поэтому временная таблица, используемая для результатов, представляет собой таблицу на диске.
Похоже, что это было удалено из руководства, начиная с MySQL 5.5, но все еще применимо в этой версии ...
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)
Информация о поле, возвращаемая с набором результатов запроса, содержит ту же информацию, что и возвращаемая SHOW COLUMNS
, поэтому a SELECT * FROM my_table LIMIT 0
должно достигать того же самого, не создавая временную таблицу на диске для каждого запроса.
Быстрый пример, чтобы просто получить имена полей в 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);
Получение информации о поле таким способом немного более неудобно для декодирования. Вам придется обратиться к описанию базовой MYSQL_FIELD
структуры, чтобы извлечь типы данных и флаги, но в моей системе она работает примерно в 7 раз быстрее.