Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL表组织与优化(Rails)_Mysql_Ruby On Rails_Optimization - Fatal编程技术网

MySQL表组织与优化(Rails)

MySQL表组织与优化(Rails),mysql,ruby-on-rails,optimization,Mysql,Ruby On Rails,Optimization,在过去的几个月里,我一直在学习RubyonRails,之前没有编程经验。最近,我一直在考虑数据库优化和表组织。我知道有很多关于这个主题的好书,但我通常是以身作则 下面是一个假设情况: 假设我正在为一个拥有250000成员(用户)的利基社区构建一个社交网络。用户有能力参加活动。假设有50000个过去/现在/将来的事件。与Facebook活动非常相似,用户可以参加任意数量的活动,一个活动可以有任意数量的参与者 在数据库中,将有一个用户表和一个事件表。不知何故,我必须在用户和事件之间创建一个关联。我可

在过去的几个月里,我一直在学习RubyonRails,之前没有编程经验。最近,我一直在考虑数据库优化和表组织。我知道有很多关于这个主题的好书,但我通常是以身作则

下面是一个假设情况:

假设我正在为一个拥有250000成员(用户)的利基社区构建一个社交网络。用户有能力参加活动。假设有50000个过去/现在/将来的事件。与Facebook活动非常相似,用户可以参加任意数量的活动,一个活动可以有任意数量的参与者

在数据库中,将有一个用户表和一个事件表。不知何故,我必须在用户和事件之间创建一个关联。我可以在users表中创建一个“events”列,这样每个用户行都将包含事件ID的散列,或者我可以在events表中创建一个“Attendes”列,这样每个事件行都将包含用户ID的散列

然而,这两种解决方案似乎都不理想。在用户的配置文件页面上,我希望显示与之关联的事件列表,如果在事件表中包含“Attenders”列,则需要扫描50000个事件行以查找所述用户的用户ID。同样,在事件页面上,我希望显示事件的与会者列表,如果在用户表中包含“事件”列,则需要扫描250000个用户行以查找所述事件的事件ID

选项3是创建第三个表,其中包含每个活动的与会者信息——但我不认为这会解决任何问题

这些都不是问题吗?Rails使访问所有这些信息变得容易,但我想我担心的是规模。我完全有可能低估了现代数据库/服务器等的速度和处理能力。扫描250000个用户行以获取特定事件ID需要多长时间?10毫秒?100毫秒?1000毫秒?我想没那么糟。我是不是想得太多了?

“在用户配置文件页面上,我想显示与他们相关联的事件列表,如果在事件表中包含“Attenders”列,则需要扫描50000个事件行以查找所述用户的用户ID。”

如果每个用户ID不是唯一的键,那么它必须扫描50000个事件行,我当然希望是这样。如果每个用户ID都是唯一的密钥,那么它就很快。同样,事件表:每个事件都有一个唯一的ID,这也是它的唯一键

你必须让这些ID成为唯一的钥匙,否则你就深陷其中了


--Pete

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

您需要第三个表(比如UserEvent或更好的UserAttendsEvent或just Attends),其中每个用户和用户参加的每个事件都有一行

因此,它将至少有一个userID和一个eventID,这两个都是用户和事件表的外键

在这两个字段上添加索引可能有利于您的查询,因为您计划有数百万行

UserEvent还可能有其他数据,比如用户注册活动的时间、她在活动上花费的钱、她是否喜欢活动等

问题是每一行都有关于“出席”的信息。谁参加了(userID)、参加了什么(eventID)、他到达的时间、期间花费的金额等。您不希望将此信息既不放在用户表中,也不放在事件表中

由于您担心性能,我将添加一个数据库如何搜索特定查询的示例。假设我们希望找到所有参加(或计划参加)活动“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)
因此,数据库访问磁盘只是为了搜索索引和读取我们需要的数据。不要读取所有数据并在其中搜索


在更复杂的查询中,或者因为查询需要表中的所有数据,或者如果尚未创建所需的索引,或者某个索引不可用,或者如果db查询优化器决定它更快,它可能会扫描表或其中的一部分,然后搜索数据。但是如果已经定义了“适当的”索引(适合您计划的使用),查询会很快。

老问题,但是在我寻找其他东西的同时添加细节

在Rails中,这是通过模型中的“has_和_besign_to _many”子句来处理的,这将为您创建多对多分辨率表。此处的文档:


使用解析实体,数据库实际上不会扫描整个表以查找信息,它使用b树索引来查找所需的特定行,因此多对多确实可以直接解决您提出的性能问题。

使用适当的索引,查询可以在一秒钟内处理5000万条记录。是的,每个用户都有一个唯一的ID,每个事件都有一个唯一的ID。Rails按照惯例做到了这一点,对吗?我认为这部分是假设的,我只是不知道这种db查询需要多长时间。只是澄清一下-一行将包含一个用户ID和一个事件ID?因此,如果3个用户每个都参加5个活动,UserEvent表中将有15行?准确地说。这是一种非常普遍的做法。