我有以下查詢:簡單的MySQL查詢優化
SELECT
b.item_name,
COUNT(distinct c.user_id) AS total_count,
AVG(c.item_rating) AS avg_rating
FROM item_ratings as c
INNER JOIN items AS b ON b.item_id = c.item_id
INNER JOIN users AS u ON u.user_id = c.user_id
WHERE item_active = 1 AND u.user_valid = 1
GROUP BY c.item_id
此查詢一個高度優化的數據庫500秒運行一次 - 不知道是怎麼回事。
指數法
item_ratings - item_user_id, (item_id, user_id), item_rating, item_id
users - user_id, user_valid
items - item_id (primary), item_search (item_id, item_name), item_r (parent_id, item_id, item_active)
表大小
接近500萬個記錄的item_ratings表,而項目表是20萬左右和用戶是25萬左右。
解釋
的解釋查詢似乎做的項目(返回所有200K行)的表進行排序,即使是在一個item_active指數。其他表(item_ratings和user)都使用正確的索引。
最新通報
FULL EXPLAIN
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE b ALL PRIMARY,item_id, item_search, item_r NULL NULL NULL 218419 Using where; Using temporary; Using filesort
1 SIMPLE c ref item_user_id ,user_id, item_id 4 myDB.b.item_id 29 Using where
1 SIMPLE u eq_ref PRIMARY,user_valid,user_id PRIMARY 4 myDB.c.user_id 1 Using where
硬件運行Ubuntu 10.10 本公司致力於MySQL服務器中,內存16GB絲毫。這些表正在運行MyISAM。
有什麼建議嗎?
發佈實際的'EXPLAIN'輸出... – Wrikken
解釋輸出丟失,顯示缺少創建表輸出,缺少存儲引擎信息,缺少存儲引擎配置變量,用於運行此操作的硬件 - 也缺少信息。不知道任何人可以給出這麼多信息不存在的答案。 –
我現在已經這樣做了,對於這個問題感到抱歉。 – gregavola