gpt4 book ai didi

MySQL 外键和索引优化

转载 作者:行者123 更新时间:2023-11-29 21:17:03 25 4
gpt4 key购买 nike

我有以下三个表:

users(约1000行)

    user_id | username | email | ....

事件(大约 50 000 行,并且以每天约 500 行的速度增加)

    event_id | e_date | e_location | e_duration | ...

以及一个将用户链接到事件的表格:

user_events:

    user_id | event_id

我在表 user_events 上设置了外键,以便在删除事件或用户时删除行,因此我在每个 user_id 上都有一个索引 (PRIMARY)每个表中都有 event_id

我对这个设计有了第二次猜测,因为在 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'

最佳答案

如果 users.user_idevents.event_id 列已定义为您的主键,那么您已经拥有这些列的索引。

users_events 表有两个索引(由您显式创建或由外键约束自动创建)。

第一个查询仅需要上述索引,不会从任何其他索引中受益。

第二个查询将受益于 events 表上的附加索引。

关于MySQL 外键和索引优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35861904/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com