MySQL表的组织和优化(Rails)

在过去的几个月中,我一直在学习Ruby on Rails,但没有任何编程经验.最近,我一直在考虑数据库优化和表组织.我知道有很多关于该主题的书,但是我通常会以身作则.

这是一个假设的情况:

假设我正在为拥有25万会员(用户)的利基社区构建社交网络.用户可以参加活动.假设有50,000个过去/现在/未来事件.就像Facebook事件一样,用户可以参加任意数量的事件,并且一个事件可以具有任意数量的参与者.

在数据库中,将有一个用于用户的表和一个用于事件的表.我必须以某种方式在用户和事件之间创建关联.我可以在用户表中创建一个“事件”列,以便每个用户行都包含事件ID的哈希,或者我可以在事件表中创建一个“参与者”列,以便每个事件行中都包含一个用户ID的哈希.

但是,这些解决方案都不是理想的.在用户的个人资料页面上,我想显示与他们相关联的事件的列表,如果我在事件表中包括“与会者”列,则需要扫描50,000个事件行以获取该用户的用户ID.同样,在事件页面上,我想显示该事件的参与者列表,如果我在用户表中包括“事件”列,则需要扫描250,000个用户行以获取所述事件的事件ID.

选项3是创建第三个表,其中包含每个事件的出席者信息-但我不知道这将如何解决任何问题.

这些不是问题吗? Rails使访问所有这些信息变得容易,但是我想我担心规模.我完全有可能低估了现代数据库/服务器等的速度和处理能力.扫描250,000个用户行以查找特定事件ID需要花费多长时间-10ms? 100毫秒? 1000毫秒?我想那还不错.我只是在想这个吗?

解决方法:

这是用户和事件之间的典型多对多关系.

您需要第三个表(例如UserEvent或更好的UserAttendsEvent或Attends),该表将为每个用户和该用户参加的每个事件都具有一行.

因此,它将至少具有一个userID和一个eventID,它们都是User和Event表的外键.

在这两个字段上添加索引可能对您的查询很有用,因为您计划拥有数百万的行.

UserEvent还可能具有其他数据,例如用户注册某个事件的时间,她在该事件上花费的金钱,是否喜欢它等等.

要注意的是,每一行都有有关“参加者”的信息.谁参加了(userID),谁参加了(eventID),他何时到达,期间花费的金额等.您不希望将此信息放置在User表或Event表中.

由于您担心性能,因此我将添加一个示例,说明数据库如何搜索特定查询.假设我们想查找所有参加(或计划参加)“ 2011年7月雅典U2音乐会”活动并与我生日相同的用户.

database plan:
1. use eventTitle index in table Event 
     to find that the event has id 47519 
   (good for us that we have created such an index).
2. use eventID index in table Attends 
     to find all (469) userids that have attended eventid 47519.
3. use the userid index in table User
     to find all the info of the 469 users.
4. search the info (birthdate) from those
     to keep only those (3) that have birthday July 24th.
     (we have not created any index that can be used here)

因此,数据库仅访问磁盘以搜索索引并读取所需的数据.不要读取所有数据并在其中搜索.

在更复杂的查询中,或者由于查询需要表中的所有数据,或者没有创建所需的索引,或者某些索引没有用,或者数据库查询优化器确定它的速度更快,因此它可能会扫描表或表的一部分,然后搜索数据.但是,如果定义了“适当的”索引(适合您的计划使用),查询将很快.

上一篇:使用Windows服务定时去执行一个方法的三种方式


下一篇:在左联接中使用group by的MySQL子查询-优化