为什么查询 infomation_schema 需要时间?

why query on infomation_schema takes time?

我是 运行 一个非常简单的 select 查询,对 information_schema 的一些 table 查询,但它总是花费太多时间。

例如:

select * from REFERENTIAL_CONSTRAINTS limit 3 ;

大约需要 34 秒

这个查询非常简单,我认为不需要table扫描,不需要任何条件等等。所以为什么要花太多时间。

information_Schema 中的一些其他 table 也需要很多时间。

谢谢

information_schema table 并不是真正的 table。它们是一种通过 SQL 接口公开服务器内部结构的机制。对这些查询的响应并非来自您可能期望的任何意义上的 "stored in a table" 数据——每次查询为 运行.

时都是 "collected"

SQL 层与收集数据的较低层之间的通信级别并不总是支持您可能期望的优化;例如,这里的 LIMIT 很可能没有成功——整个 table 正在内部呈现,然后除前三行外的所有行都被丢弃......所以这个查询可能就像有限制和无限制都会变慢。

关于 information_schema 的两条一般经验法则 -- 这对所有 SQL 都非常有效,但特别是在这里,select 只需要您需要的列(不是 *,这可能需要服务器做比必要更多的工作,如果你真的不需要返回所有的列)并指定 WHERE,两者都 可能 减少正在完成的内部工作量。

另一个潜在的性能杀手是对服务器变量的粗暴调整 ("tuning")。大多数系统上的大多数变量都需要经常保持独立。其中一些,例如 table_open_cache 甚至会导致服务器性能更差,您对它们进行的调整越 "optimally" 。