由于我的博客导致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
我很感激任何帮助。
谢谢!
答案 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会需要数月的工作。
但是你可以做一两件事。
答案 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
,这会产生相同的效果,但会更快。
同时,由于JOINs
在COUNT()
完成之前发生,因此计算错误。所以这个数字可能会大幅膨胀。
如果您想要更多讨论,请提供SHOW CREATE TABLE
和EXPLAIN SELECT ...
。