我很難確定如何查詢/索引數據庫。MySQL:將where子句中的日期與連接進行比較
情況很簡單。每次用戶訪問某個類別時,都會存儲他/她的訪問日期。我的目標是列出用戶最近訪問後添加元素的類別。
這裏有兩個表:
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.3s ,這對於Web上下文中的每個用戶操作都應該執行的內容來說太長了。
如果可能,我應該添加哪些索引,或者應該如何重寫此查詢以避免使用文件和臨時表?
您提到表'element_views'。但它沒有加入,也沒有列在'FROM'中。你能把它從這個查詢中排除嗎? – mvp