Mysql
選擇主鍵的表的優化
我有這個查詢:
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.ID
、wp_dev_postmeta.post_id
、wp_dev_term_relationships.object_id
和上具有索引post_type
。
wp_dev_posts
在for上創建複合索引可能是有意義的(post_type, ID)
。您可能需要一個外鍵來
wp_dev_postmeta
指向定義的主鍵wp_dev_posts.ID
。提供有關您的特定環境的更多詳細資訊,包括表的定義、任何現有查詢、行數等,將有助於我們提供更明確的答案。