Mysql

選擇主鍵的表的優化

  • August 2, 2019

我有這個查詢:

SELECT * 
FROM wp_dev_posts, wp_dev_postmeta, wp_dev_term_relationships 
WHERE ((post_type = 'projects') OR (post_type = 'post_cost_codes')) 
   AND (wp_dev_posts.ID = wp_dev_postmeta.post_id) 
   AND (wp_dev_posts.ID = wp_dev_term_relationships.object_id);

我的問題是,當我在哪裡有這個時:

wp_dev_posts.ID = wp_dev_term_relationships.object_id

優化這個的正確方法是什麼?我最好使用聯接嗎?我設置索引嗎?我使用外鍵嗎?在大型數據庫上,這實際上需要幾秒鐘才能執行。

SQL新手在這裡。

僅供參考,這是 Wordpress,文章中有 33k 行,postmeta 中約有 250k 行。

一般來說,您希望像這樣重寫該查詢:

SELECT * 
FROM wp_dev_posts
   INNER JOIN wp_dev_postmeta 
       ON wp_dev_posts.ID = wp_dev_postmeta.post_id
   INNER JOIN wp_dev_term_relationships 
       ON wp_dev_posts.ID = wp_dev_term_relationships.object_id
WHERE ((post_type = 'projects') OR (post_type = 'post_cost_codes'));

請注意,我已使用構造將部分WHERE子句移至子句。這使查詢更易於閱讀。FROM``ON

為了優化對錶的訪問,您通常希望在wp_dev_posts.IDwp_dev_postmeta.post_idwp_dev_term_relationships.object_id和上具有索引post_type

wp_dev_posts在for上創建複合索引可能是有意義的(post_type, ID)

可能需要一個外鍵來wp_dev_postmeta指向定義的主鍵wp_dev_posts.ID

提供有關您的特定環境的更多詳細資訊,包括表的定義、任何現有查詢、行數等,將有助於我們提供更明確的答案。

引用自:https://dba.stackexchange.com/questions/244433