从information_schema表中选择非常慢

时间:2016-12-20 08:22:24

标签: mysql performance

从information_schema.tables查询*非常慢。 Innodb_stats_on_metadata关闭,从表中选择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)

2 个答案:

答案 0 :(得分:1)

选择更多列意味着服务器必须做更多工作 - 查询所有模式中所有表的存储引擎以获取您请求的内容。

information_schema中的表不是真正的表。它们是服务器内部,通过SQL接口公开,在某些情况下允许您查询服务器未存储的信息,并且必须计算或收集,因为您询问。服务器代码知道您要求的列,并且只收集该信息。

LIMIT 1没有帮助,因为information_schema没有像你期望的那样处理LIMIT - 整个表在返回第一行之前呈现在内存中,其余的都被丢弃。 / p>

答案 1 :(得分:0)

即使在5.7中,有关表的信息也分散在磁盘上的文件中。阅读200K文件需要花费很多时间。

这就是为什么200K表不是一个好设计的原因之一。其他原因与缓存有关 - 这方面存在实际限制。

由于缓存,您会看到I_S查询的时间变化。

建议:重新考虑您的架构设计。

8.0在InnoDB表中存储所有信息,因此速度会非常快。