我在一些information_schema表上运行一个非常简单的选择查询,但它总是花费太多时间。
例如:
从REFERENTIAL_CONSTRAINTS限制3中选择*;
需要 34秒。
这个查询非常简单,我认为不需要表扫描,不需要任何条件等等。那么为什么需要花费太多时间。
information_Schema中的其他一些表也需要很多时间。
由于
答案 0 :(得分:1)
information_schema表不是真正的表。它们是一种通过SQL接口公开服务器内部的机制。对这些查询的响应不是来自您可能期望的“存储在表中”的数据 - 每次运行查询时都会“收集”它。
SQL层与收集数据的较低层之间的通信级别并不总是支持您可能期望的优化;例如,这里的LIMIT
很可能没有让它失效 - 整个表都在内部呈现,然后除了前三行之外的所有行都被丢弃了...所以这个查询可能同样很慢限制。
使用information_schema的两个一般经验法则 - 它们对所有SQL都有效,但特别是在这里,只选择你需要的列(不是*
,这可能需要服务器做更多如果你真的不需要返回所有列,那么工作量不必要)并指定WHERE
,这两个可能减少正在完成的内部工作量。
另一个潜在的性能杀手是服务器变量的严厉调整(“调整”)。大多数系统上的大多数变量需要经常保持不变。其中一些,如table_open_cache
甚至可能导致服务器性能下降,调整它们的“最优”。