我在一个2000万条记录表中有一个简单的查询,我需要一个索引来改进以下查询的select语句:
SELECT count(item_id), count(distinct user_id)
FROM activity
INNER JOIN item on item.item_id = activity.item_id
WHERE item.item_id = 3839 and activity.created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY)
我有一个索引:
activity - activity_id (PRIMARY), item_id, created_at - All Single Index
item - item_id (PRIMARY)
对于包含大量内容(如600k)的项目,运行查询需要4-5秒。
有什么建议吗?
答案 0 :(得分:0)
如果从FOREIGN KEY
到activity
存在item
约束(假设user_id
在表activity
中),那么您的查询相当于:
SELECT COUNT(*), COUNT(DISTINCT user_id)
FROM activity
WHERE item_id = 3839
AND created_at >= DATE_SUB(NOW(), INTERVAL 30 DAY) ;
应该更高效,因为它必须只从一个表或一个索引获取数据。 (item_id, created_at, user_id)
上的索引很有用。