【发布时间】:2009-05-06 06:08:09
【问题描述】:
我有一个页面需要 37 秒才能加载。在加载时,它将 MySQL 的 CPU 使用率固定在最高点。这个页面的代码不是我写的,而且相当复杂,所以瓶颈的原因对我来说不是很明显。
我对其进行了分析(使用 kcachegrind),发现页面上的大部分时间都花在了 MySQL 查询上(90% 的时间花在了 25 个不同的 mysql_query 调用上)。
查询采用以下形式,tag_id 在 25 个不同调用中的每一个都发生变化:
SELECT * FROM tbl_news WHERE news_id IN(选择 news_id 来自 tbl_tag_relations WHERE tag_id = 20)
每个查询大约需要 0.8 秒才能完成,但需要更长的延迟才能更好地衡量......因此需要 37 秒才能完全加载页面。
我的问题是,导致问题的嵌套选择是查询格式化的方式吗?或者它可能是一百万个其他事物中的任何一个?任何有关如何解决这种缓慢问题的建议都值得赞赏。
在查询上运行 EXPLAIN 给了我这个(但我不清楚这些结果的影响......主键上的 NULL 看起来会很糟糕,是吗?返回的结果数量对我来说似乎很高以及最后只返回少数结果):
1 PRIMARY tbl_news ALL NULL NULL NULL NULL 1318 使用 where 2 DEPENDENT SUBQUERY tbl_tag_relations ref FK_tbl_tag_tags_1 FK_tbl_tag_tags_1 4 const 179 使用 where【问题讨论】:
-
您可以在 tbl_news 和 tbl_tag_relations 表上发布索引吗?解释说明将使用哪些索引,但没有说明它们的组件是什么。我猜这是一个“缺少索引”的问题(尽管运行 25 个单独的查询也不好)
-
你是对的,乔纳森。这是一个缺少索引的问题。 Cletus 指出了哪一个和他的建议导致了 10 倍的加速。
标签: php optimization mysql