2011-12-08 72 views
0

我的網絡主機暫停我的帳戶,由於我的博客造成的MySQL超載。他們問我來檢查慢查詢並解決「索引」他們的問題,但我不能完全明白應該怎麼做這裏:緩慢的MySQL查詢(WordPress的)

# 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 

我會很感激的任何幫助。

謝謝!

回答

1

你真的不能做太多,因爲生成這個查詢和數據庫結構的代碼不是你的,重寫wordpress需要幾個月的工作。

但是你可以做一兩件事。

  1. 問題查詢包含wp_post2tag表,它不屬於wordpress本身,而是屬於Ultimate Tag Warrior插件。也許刪除或禁用這個插件可能會有所幫助。
  2. 你可以嘗試升級wordpress和所有插件到最新版本,也許問題已經解決。
  3. 默認情況下,WP使用的並不是最優化的,但可以在任何MyISAM表中使用。您可以嘗試將您的數據庫遷移到InnoDB表。但是我不會建議你這樣做,如果你沒有很好地掌握mysql的工作方式。
+0

你確定它的UTW?導致其在慢查詢日誌中的幾個查詢中的僅一個:http:// cl。ly/3f3B3d0Q081k1g0i2l1d謝謝! – 3zzy

+1

@Nimbuz好吧,從你的其他評論中解釋說它是一個罪魁禍首,而且它的聲譽相當不好。在慢日誌中,有一些最基本的查詢,沒有真正的理由要執行這麼久 - 除了被長時間運行的UTW查詢阻塞在資源之外。 – Nameless

+0

謝謝你,幫助解決它! – 3zzy

0

你需要你使用EXPLAIN來查看你的查詢的計劃,它會告訴你什麼可以被優化。 我懷疑問題是與組和訂單部分。

+0

我做了,顯示這個:http://cl.ly/082x340t3r0W1j0B0i3S – 3zzy

+0

你有機會添加索引到數據庫,你可以複製它到你的服務器玩它並優化? – Oleg

3

在您做任何事情之前,請升級到最新版本的WordPress並將您的UTW標籤結構導入到WordPress內置的術語體系結構中;如果您在導入之前升級到WP 3.x,則必須使用像this one這樣的導入插件。它仍然不是我見過的最高效的SQL,但它比UTW標籤sql更清潔,而這並不是WordPress的內部標籤。

我通常會同意@ Nameless的觀點#1,除了因爲您看到這些查詢會在您的博客上導致問題,我想您正在使用UTW標記功能,並且您需要遷移標記結構從UTW到本地WordPress術語,然後才能關閉UTW,否則您可能會失去依賴的功能。除非你有其他與UTW,MySQL無關的問題,否則我不會建議嘗試切換到InnoDB;除非你有一個非常高的流量站點,我不認爲從切換表類型的勝利將是值得的這樣做的痛苦。

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.tagGROUP BY p2t.tag_id,這將有同樣的效果,但要快。

同時,由於JOINsCOUNT()完成之前發生,因此計算錯誤。所以這個數字可能嚴重誇大。

如果你想要更多的討論請求提供SHOW CREATE TABLEEXPLAIN SELECT ...