Dalam kasus khusus ini, saya pikir INFORMATION_SCHEMA
ini adalah herring merah. Dari tes SHOW COLUMNS
kinerja saya sendiri , innodb_stats_on_metadata
variabel tampaknya tidak membuat perbedaan pada tabel MyISAM atau InnoDB.
Namun, dari manual MySQL 5.0 ...
Beberapa kondisi mencegah penggunaan tabel sementara di-memori, dalam hal ini server menggunakan tabel di-disk sebagai gantinya:
[...]
- The
SHOW COLUMNS
dan The DESCRIBE
pernyataan menggunakan BLOB
sebagai jenis untuk beberapa kolom, sehingga tabel sementara yang digunakan untuk hasil adalah meja on-disk.
Ini tampaknya telah dihapus dari manual pada MySQL 5.5, tetapi masih berlaku untuk versi itu ...
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)
Informasi bidang yang dikembalikan dengan set hasil kueri berisi informasi yang sama dengan yang dikembalikan oleh SHOW COLUMNS
, sehingga SELECT * FROM my_table LIMIT 0
harus mencapai hal yang sama tanpa membuat tabel sementara di-disk per kueri.
Contoh cepat untuk hanya mengambil nama bidang dalam 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);
Mengambil info bidang dengan cara ini sedikit lebih canggung untuk diterjemahkan. Anda harus berkonsultasi dengan deskripsi MYSQL_FIELD
struktur yang mendasarinya untuk mengeluarkan tipe data dan flag, tetapi itu berjalan sekitar 7 kali lebih cepat pada sistem saya.