Trong trường hợp cụ thể này, tôi nghĩ rằng đó INFORMATION_SCHEMA
là một cá trích đỏ. Từ các thử nghiệm SHOW COLUMNS
hiệu năng của riêng tôi , innodb_stats_on_metadata
biến này dường như không tạo ra bất kỳ sự khác biệt nào trên các bảng MyISAM hoặc InnoDB.
Tuy nhiên, từ hướng dẫn sử dụng MySQL 5.0 ...
Một số điều kiện ngăn việc sử dụng bảng tạm thời trong bộ nhớ, trong trường hợp đó, máy chủ sử dụng bảng trên đĩa thay thế:
[...]
- Các câu lệnh
SHOW COLUMNS
và Các DESCRIBE
câu lệnh sử dụng BLOB
làm kiểu cho một số cột, do đó bảng tạm thời được sử dụng cho các kết quả là một bảng trên đĩa.
Điều này dường như đã bị xóa khỏi hướng dẫn sử dụng từ MySQL 5.5, nhưng vẫn xuất hiện để áp dụng trong phiên bả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)
Thông tin trường được trả về với tập kết quả truy vấn chứa cùng thông tin được trả về SHOW COLUMNS
, do đó, SELECT * FROM my_table LIMIT 0
cần đạt được điều tương tự mà không cần tạo bảng tạm thời trên đĩa cho mỗi truy vấn.
Một ví dụ nhanh để lấy tên trường trong 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);
Lấy thông tin trường theo cách này là một chút khó khăn hơn để giải mã. Bạn sẽ phải tham khảo mô tả MYSQL_FIELD
cấu trúc cơ bản để lấy ra các kiểu dữ liệu và cờ, nhưng nó chạy nhanh hơn khoảng 7 lần trên hệ thống của tôi.