慢MySQL查询(Wordpress)

时间:2011-12-08 05:57:40

标签: mysql performance wordpress indexing

由于我的博客导致mysql过载,我的webhost暂停了我的帐户。他们让我检查慢查询并通过“索引”来解决问题,但我不太明白我该怎么做:

# Query_time: 1.116245  Lock_time: 0.000202 Rows_sent: 10  Rows_examined: 3486
use mydbname
select tag, t.tag_id, count(p2t.post_id) as count, ((count(p2t.post_id)/1070)*100) as weight, ((count(p2t.post_id)/109)*100) as relativeweight
  from wp_tags t inner join wp_post2tag p2t on t.tag_id = p2t.tag_id
  inner join wp_posts p on p2t.post_id = p.ID
  WHERE post_date_gmt < '2011-12-06 09:00:01'
  AND (post_type = 'post')
  group by t.tag
  order by weight desc
  LIMIT 10

# Tue Dec  6 02:00:08 2011
# Query_time: 6.926785  Lock_time: 1.731793 Rows_sent: 10  Rows_examined: 3486
use mydbname
select tag, t.tag_id, count(p2t.post_id) as count, ((count(p2t.post_id)/1070)*100) as weight, ((count(p2t.post_id)/109)*100) as relativeweight
  from wp_tags t inner join wp_post2tag p2t on t.tag_id = p2t.tag_id
  inner join wp_posts p on p2t.post_id = p.ID
  WHERE post_date_gmt < '2011-12-06 09:00:01'
  AND (post_type = 'post')
  group by t.tag
  order by weight desc
  LIMIT 10

我很感激任何帮助。

谢谢!

4 个答案:

答案 0 :(得分:3)

在您执行任何其他操作之前,请升级到最新版本的WordPress并将您的UTW标记结构导入WordPress的内置术语体系结构;如果在进行导入之前升级到WP 3.x,则必须使用像this one这样的导入插件。它仍然不是我见过的最有效的sql,但它比UTW标签sql更清晰,它不是WordPress内部的。

我一般会同意@ Nameless的观点#1,但是因为你看到这些查询在你的博客上引起问题我想你正在使用UTW标签功能,你需要从中迁移标签结构在您停用UTW之前UTW到原生WordPress术语,否则您可能会丢失您依赖的功能。

除非你有其他与UTW,MySQL无关的问题,否则我不建议尝试切换到InnoDB;除非你有一个非常高的流量网站,否则我认为切换表类型的胜利不值得这么做。

答案 1 :(得分:1)

你真的做不了多少,因为生成这个查询和数据库结构的代码不是你自己的,重写wordpress会需要数月的工作。

但是你可以做一两件事。

  1. 问题查询包含wp_post2tag表,它不属于wordpress本身,而是属于Ultimate Tag Warrior插件。也许删除或禁用此插件可能有所帮助。
  2. 你可以尝试将wordpress和所有插件升级到最新版本,也许问题已经解决了。
  3. 默认情况下,WP在所有MyISAM表中都使用不那么优化但可用的方式。您可以尝试将数据库迁移到InnoDB表。但是如果你对mysql的工作方式没有很好的掌握,我不建议这样做。

答案 2 :(得分:0)

您需要使用EXPLAIN查看查询计划,它会显示可以优化的内容。 我怀疑问题出在组和订单部分。

答案 3 :(得分:0)

wp_posts:  INDEX(post_type, post_date_gmt)  -- in this order
wp_post2tag:  INDEX(post_id, tag_id)        -- in this order

删除对wp_tags的所有引用并更改GROUP BY t.tag GROUP BY p2t.tag_id,这会产生相同的效果,但会更快。

同时,由于JOINsCOUNT()完成之前发生,因此计算错误。所以这个数字可能会大幅膨胀。

如果您想要更多讨论,请提供SHOW CREATE TABLEEXPLAIN SELECT ...