我想確定最佳的一般方法來查詢連接兩個有很多數據的表,其中每個表都有where子句中的一列。想象一下,一個簡單的模式瓦特/兩個表:在MySQL中,如何加入兩個在WHERE條件中都有列的非常大的表?
posts
id (int)
blog_id (int)
published_date (datetime)
title (varchar)
body (text)
posts_tags
post_id (int)
tag_id (int)
用以下指標:
posts: [blog_id, published_date]
tags: [tag_id, post_id]
我們要選擇上都標有「富」給定的博客最近的10個職位。爲了這個討論,假設這個博客有1000萬個帖子,並且有100萬個帖子被標記爲「foo」。什麼是查詢這些數據最有效的方法?
天真的方法是這樣:
SELECT
id, blog_id, published_date, title, body
FROM
posts p
INNER JOIN
posts_tags pt
ON pt.post_id = p.id
WHERE
p.blog_id = 1
AND pt.tag_id = 1
ORDER BY
p.published_date DESC
LIMIT 10
MySQL將使用我們的索引,但最終仍要掃描數百萬條記錄。有沒有一種更有效的方法來檢索這種數據而不反規範化模式?
讓引擎做這項工作。提供提示(索引)並檢查執行計劃。如果正在執行全面掃描,那麼它可能是必需的(對於給定的提示 - 檢查您的覆蓋索引),或者計劃生成器失敗(可能它認爲[全面]掃描仍然會獲勝,在這種情況下甚至可能會是正確的)。我不是DBA,但我從來沒有遇到過需要根據非規範化數據(瞬態非規範化數據與[非規範化]非規範化關係模式不一樣)的情況。 – 2010-09-07 21:36:33
偉大的問題。我發現這種類型的問題唯一的解決方案是反規範化。 – nathan 2010-09-07 22:01:44