我有以下三个表:
users
(约1000行)
user_id | username | email | ....
events
(约5万行,每天增加约500)
event_id | e_date | e_location | e_duration | ...
以及将用户链接到事件的表格:
users_events
:
user_id | event_id
我在表users_events
上设置外键,以便在删除事件或用户时删除行,因此每个user_id
和event_id
都有一个索引(PRIMARY)在每个表格中。
我对此设计进行了第二次猜测,因为在events.event_id
上设置索引感觉很愚蠢,因为它是一个唯一ID,其基数等于行数。
events.date
每年的最大基数为365,而events.location
的上限大约为200,因此对于索引而言,这些信息比event_id
更适合。
有什么建议吗?
最常用查询的示例:
查找用户要访问的事件:
SELECT e.date, e.location FROM events e
JOIN users_events ue ON ue.event_id = e.event_id
JOIN users u ON u.user_id = ue.user_id
WHERE user_id = 'currentuserid'
OR
根据其特征查找事件是否已存在:
SELECT event_id FROM events
WHERE date='eventdate'
AND location='eventlocation'
AND duration='eventduration'
答案 0 :(得分:0)
如果已将这些列定义为主键,则您已在users.user_id
和events.event_id
上拥有索引。
users_events
表有两个索引(由您显式创建或由外键约束自动创建)。
第一个查询只需要上面提到的索引,不会受益于任何其他索引。
第二个查询将受益于events
表上的附加索引。