我有一个文件共享网站,我的用户对点击他们的文件感兴趣。每次点击都会在 clicks 表中存储为一个新行。
通常,他们想知道在某个日期范围内获得了多少点击:
$statement = $db->prepare("SELECT COUNT(DISTINCT ip) FROM clicks WHERE user_id=? AND time BETWEEN ? AND ?");
$statement->execute(array($user_id, $from_date, $to_date));
此外,他们还可以查看某个文件的点击次数:
$statement = $db->prepare("SELECT COUNT(DISTINCT ip) FROM clicks WHERE file_id=? AND time BETWEEN ? AND ?");
$statement->execute(array($file_id, $from_date, $to_date));
这些查询的问题在于 user_id 和 file_id 不是该表的键(它们不是唯一的)。相反,一个简单的“id”列是主键,但它从不参与任何查询。
我一直在研究聚集索引,但我不知道在这种情况下如何实现它。
随着 clicks 表变得非常大(5-6 百万行),这些查询需要更长的时间(我计划让这个表变得更大)。我读到分区可能是我需要做的?
我需要创建一个聚集键、对表进行分区,还是两者都需要?
供参考,clicks
结构:
id
time
user_id
ip
file_id