我有一個關於mysql基本數據庫優化的問題。 我有3個表格,文章,標籤和標籤(這是一個連接表)。針對mysql的索引進行基本優化
Articles Taggings Tags
id id id
name article_id name
tag_id
我檢索恰好匹配指定標籤的物品,用下面的查詢
SELECT *, COUNT(*) AS c
FROM articles AS a
JOIN taggings AS tng ON a.id = tng.article_id
JOIN tags AS t ON t.id = tng.tag_id
WHERE t.name IN ("Red","Green")
GROUP BY a.id
HAVING c = 2
這個查詢很慢,所以我做了講解,並得到了以下結果:
alt text http://dl.dropbox.com/u/2306276/EXPLAIN%20results.png
現在,我真的不明白我在這裏做什麼,但我認爲「類型:ALL」不好,所以我以爲我會添加索引(BT REE)添加到taggings表中的article_id和tag_id中,然後再次運行查詢。 alt text http://dl.dropbox.com/u/2306276/EXPLAIN%20results%202.png 那麼這對我沒有受過教育的眼睛來說看起來沒有什麼更好的,與前一行相同的行數,並且類型在兩種情況下仍然是ALL。
所以有人可以告訴我哪裏出錯了嗎?索引不會幫助我解決這個問題嗎?
我的標籤表將保持相對較小,所以我認爲查詢應該掃描標籤表以查找我指定的標籤,然後(通過索引)能夠立即檢索關聯的屬性,它應該都是很快,我的想法顯然是錯誤的。
感謝
[編輯] - 周杰倫的評論
我加入10K的文章,30K引用的Tagging和6個標籤,還增加了tag.name和taggings.tag_id 2個指數法,查詢還是花了長時間運行,0.5-1秒,EXPLAIN在下面。 alt text http://dl.dropbox.com/u/2306276/EXPLAIN%20results%203.png
是tags.name索引? – Naktibalda 2010-07-19 20:52:37
我必須[想知道GROUP BY是否由於MySQL對隱藏列的支持而導致性能不佳](http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden -columns.html) – 2010-07-19 20:55:10
你有一個tags.name的索引嗎?如果你的數據庫有很多記錄 – 2010-07-19 20:57:01