この特定のケースでは、私はそれINFORMATION_SCHEMA
が赤いニシンだと思います。私自身のSHOW COLUMNS
パフォーマンステストから、innodb_stats_on_metadata
変数はMyISAMまたはInnoDBテーブルのいずれにも影響を与えないようです。
ただし、MySQL 5.0マニュアルから ...
一部の条件では、メモリ内の一時テーブルを使用できません。その場合、サーバーは代わりにディスク上のテーブルを使用します。
[...]
- 文を使用いくつかの列の型として、このような結果のために使用される一時テーブルはディスク上の表です。
SHOW COLUMNS
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
ため、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倍速く実行されます。