MySQL外键和索引优化

时间:2016-03-08 07:55:43

标签: mysql indexing foreign-keys

我有以下三个表:

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_idevent_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'

1 个答案:

答案 0 :(得分:0)

如果已将这些列定义为主键,则您已在users.user_idevents.event_id上拥有索引。

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

第一个查询只需要上面提到的索引,不会受益于任何其他索引。

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