具有大行的MySQL简单查询改进

时间:2013-02-07 22:39:58

标签: mysql query-optimization

我在一个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秒。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

如果从FOREIGN KEYactivity存在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)上的索引很有用。