【发布时间】:2023-03-24 16:23:01
【问题描述】:
我有以下三个表:
users(约1000行)
user_id | username | email | ....
events(大约 50 000 行,每天增加约 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'
或
根据事件的特征判断事件是否已经存在:
SELECT event_id FROM events
WHERE date='eventdate'
AND location='eventlocation'
AND duration='eventduration'
【问题讨论】:
-
没有理由你不能拥有多个索引,MySQL 只会选择它认为最适合该查询的一个。额外的索引确实意味着插入时间略有增加,但对于大多数应用程序而言,与 SELECT 的节省相比,这将是最小的。对于连接,唯一索引几乎可以得到。您的第一个查询将根据 user_id 从用户中选择一行(希望您有一个索引),使用 users_events.user_id 上的索引将其连接到 users_events,然后根据 events.events_id 上的索引将其连接到事件(希望主键)。
-
SHOW CREATE TABLE。看看你的 many:many 表是否看起来像 this。
标签: mysql indexing foreign-keys