2011-06-16 155 views
1

爲了提高「大型」數據庫的性能,下列查詢可以更改多少?優化MySQL SELECT查詢?

SELECT SQL_CALC_FOUND_ROWS wp_rb_posts.* 
FROM wp_rb_posts 
WHERE 1=1 
    AND ((guid = '956e208f101562f6654e88e9711276e4') 
    OR (guid = 'http://www.r-bloggers.com/?guid=956e208f101562f6654e88e9711276e4') 
    OR (guid = 'http://www.r-bloggers.com/?guid=956e208f101562f6654e88e9711276e4') 
    OR (MD5(guid) = '956e208f101562f6654e88e9711276e4')) 
AND wp_rb_posts.post_type 
    IN ('post', 'page', 'attachment', 'revision', 'nav_menu_item') 
AND (wp_rb_posts.post_status = 'publish' 
     OR wp_rb_posts.post_status = 'future' 
     OR wp_rb_posts.post_status = 'draft' 
     OR wp_rb_posts.post_status = 'pending' 
     OR wp_rb_posts.post_status = 'trash' 
     OR wp_rb_posts.post_status = 'auto-draft' 
     OR wp_rb_posts.post_status = 'inherit' 
     OR wp_rb_posts.post_status = 'private') 
ORDER BY wp_rb_posts.post_date DESC LIMIT 1400, 10; 
+1

試過'EXPLAIN'但 – Jacco 2011-06-16 20:17:03

+0

請嘗試格式化你的代碼在未來可讀性這是重新格式化_pain_。 – Oded 2011-06-16 20:19:29

+0

Jacco - no。Oded - 對不起,謝謝! – 2011-06-16 20:21:07

回答

0

不知道任何涉及的表,我根據查詢中的字段名稱進行猜測。我的猜測是查詢中限制最嚴格的部分是guid=...部分。從查詢的結構看來,該字段的內容還沒有完全定義好(有時它可能有md5散列值,有時可能不是)。如果這是正確的,那麼使用md5(guid) = '...'可能意味着它不能有效地限制該部分的查詢。

因此,如果可能的話,如果您有一個始終包含guid字段的md5哈希值的字段,它會使搜索更有效。然後,可以對該字段進行索引,併爲該部分查詢提供更高效的查找。

,試圖澄清,只是考慮這個查詢:

SELECT SQL_CALC_FOUND_ROWS wp_rb_posts.* 
FROM wp_rb_posts WHERE 
    (guid = '956e208f101562f6654e88e9711276e4') OR 
    (MD5(guid) = '956e208f101562f6654e88e9711276e4')) 

假設MySQL不使用標量函數(我不認爲它允許指標,如果我錯了,那麼這個完整的答案是毫無意義的),那麼該查詢將需要在每個記錄上計算全表掃描md5(guid)。而下面的查詢可以進行優化,更好的(假設這兩個領域存在的索引:?

SELECT SQL_CALC_FOUND_ROWS wp_rb_posts.* 
FROM wp_rb_posts WHERE 
    (guid = '956e208f101562f6654e88e9711276e4') OR 
    (md5_guid = '956e208f101562f6654e88e9711276e4') 
2

我會看看該查詢的執行計劃,然後確保您有索引設置來優化查詢。根據執行計劃,您還可以看到重新排列部分查詢會加快性能。

直接回答你的問題,雖然着名的「這取決於」的答案是在這裏生效。我將不得不看到你的數據庫,運行查詢,查看執行計劃,查看索引的內容以及執行計劃生成的子句的順序是如何影響性能的。

希望對你有所幫助。