次のクエリがあります。
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)
テーブルサイズ
item_ratings テーブルは 500 万レコードに近く、items テーブルは約 20 万件、ユーザーは約 25 万件です。
説明
item_active にインデックスがあるにもかかわらず、explain クエリはアイテムのテーブル ソート (20 万行すべてを返す) を行うようです。他のテーブル (item_ratings と user) はどちらも正しいインデックスを使用しています。
アップデート
完全な説明
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 の RAM を搭載しています。テーブルは MyISAM を実行しています。
助言がありますか?