查询 *来自Information_schema.tables非常慢。INNODB_STATS_ON_METADATA关闭,桌子中的Select table_name快速,选择更多字段非常慢(12分钟!)
mysql> select * from tables limit 1;
+---------------+--------------------+----------------+-------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+
| TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | ENGINE | VERSION | ROW_FORMAT | TABLE_ROWS | AVG_ROW_LENGTH | DATA_LENGTH | MAX_DATA_LENGTH | INDEX_LENGTH | DATA_FREE | AUTO_INCREMENT | CREATE_TIME | UPDATE_TIME | CHECK_TIME | TABLE_COLLATION | CHECKSUM | CREATE_OPTIONS | TABLE_COMMENT |
+---------------+--------------------+----------------+-------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+
| def | information_schema | CHARACTER_SETS | SYSTEM VIEW | MEMORY | 10 | Fixed | NULL | 384 | 0 | 32869632 | 0 | 0 | NULL | 2016-12-19 23:55:46 | NULL | NULL | utf8_general_ci | NULL | max_rows=87381 | |
+---------------+--------------------+----------------+-------------+--------+---------+------------+------------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------------+
1 row in set (**12 min 27.02 sec**)
其他信息:
mysql> select count(*) from tables;
+----------+
| count(*) |
+----------+
| 194196 |
+----------+
1 row in set (0.57 sec)
mysql> show global variables like '%innodb%metada%';
+--------------------------+-------+
| Variable_name | Value |
+--------------------------+-------+
| innodb_stats_on_metadata | OFF |
+--------------------------+-------+
1 row in set (0.00 sec)
选择更多列意味着服务器必须做更多的工作 - 询问所有架构中所有表的存储引擎以获取您要求的内容。
信息_schema中的表不是真实表。它们是通过SQL接口暴露的服务器内部设备,在某些情况下,您可以查询服务器不存储的信息,并且由于询问而必须计算或收集。服务器代码知道您要求哪些列,只收集信息。
LIMIT 1
无济于事,因为Information_Schema不会如您期望的那样处理LIMIT
- 整个表在返回第一行并丢弃其余的情况下都呈现在内存中。
即使在5.7中,有关表的信息也散布在磁盘上的文件中。读取200k文件需要很多时间。
这就是为什么200k桌不是一个好设计的原因之一。其他原因与缓存有关 - 此类也有实际限制。
由于缓存,您会看到I_S查询时间的变化。
建议:重新考虑您的模式设计。
8.0将所有这些信息存储在InnoDB表中,因此它将更快。