データベースのクエリ/インデックス作成方法を理解するのに苦労しています。
状況は非常に単純です。ユーザーがカテゴリにアクセスするたびに、ユーザーのアクセス日が保存されます。私の目標は、ユーザーが最後にアクセスした後に要素が追加されたカテゴリを一覧表示することです。
2つの表は次のとおりです。
CREATE TABLE `elements` (
`category_id` int(11) NOT NULL,
`element_id` int(11) NOT NULL,
`title` varchar(255) NOT NULL,
`added_date` datetime NOT NULL,
PRIMARY KEY (`category_id`,`element_id`),
KEY `index_element_id` (`element_id`)
)
CREATE TABLE `categories_views` (
`member_id` int(11) NOT NULL,
`category_id` int(11) NOT NULL,
`view_date` datetime NOT NULL,
PRIMARY KEY (`member_id`,`category_id`),
KEY `index_element_id` (`category_id`)
)
クエリ:
SELECT
categories_views.*,
elements.category_id
FROM
elements
INNER JOIN categories_views ON (categories_views.category_id = elements.category_id)
WHERE
categories_views.member_id = 1
AND elements.added_date > categories_views.view_date
GROUP BY elements.category_id
説明:
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: elements
type: ALL
possible_keys: PRIMARY
key: NULL
key_len: NULL
ref: NULL
rows: 89057
Extra: Using temporary; Using filesort
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: categories_views
type: eq_ref
possible_keys: PRIMARY,index_element_id
key: PRIMARY
key_len: 8
ref: const,convert.elements.category_id
rows: 1
Extra: Using where
各テーブルに約10万行あるため、クエリには約0.3秒かかります。これは、Webコンテキストのすべてのユーザーアクションに対して実行する必要があるものには長すぎます。
可能であれば、どのインデックスを追加する必要がありますか、またはファイルソートと一時テーブルの使用を回避するためにこのクエリをどのように書き直す必要がありますか?