2012-01-07 104 views
0

我有我的工作台周围5,00,000用户和每个用户都与一些书籍(的has_many)什么是最好的办法......考虑性能

我想与他们的书一起显示所有用户相关联。 ...

我不会显示在同一页面的所有用户,他们将分页。

什么是最好的方式来做到这一点,保持性能,数据库点击头脑。处理大量记录时需要考虑的是什么。

+0

你想显示500万条记录? – 2012-01-07 17:55:23

+0

你必须将数据分成更小的块。 – methyl 2012-01-07 17:57:50

+1

你真的想在同一页面上显示所有用户和他们的书吗? – afaf12 2012-01-07 17:58:11

回答

0

几点思考 -

MySQL是足够聪明地处理这些多条记录。您可以在单个查询中阅读所有用户和他们的书籍,然后按照您的意愿显示它们。但是,在单个网页上显示这些记录会影响响应时间。

因此来分页 - 每页读取有限的记录。虽然这将意味着每个页面的SQL查询,但仍然是优化的。当然,你可以使用一些查询缓存。

更好的选择可能是显示用户的字母顺序列表,不一定是A-Z,也可以是AB,AC,AD等。这样你的访问者就可以直接跳到特定的列表。如果给定列表中的用户数量过大,请考虑为其添加分页。

我不知道如何重要的是它为您的网站,以尽快展示最新的更新,但你也可以认为上生成XML文件,多达你似乎必要的,例如字母和生成从XML网页文件。您可以每24小时更新一次这些XML文件。所以,最小DB负载。

请考虑建立一个搜索,因为通过这些许多用户导航可能会令人沮丧。

希望它有帮助!

+0

通过网络发送许多记录到运行其代码的机器以及该机器上的内存,会引起系统管理员的愤怒,极大地降低系统速度,并浪费大量CPU。使用偏移量分页到数据库记录是唯一能很好地扩展的解决方案。即使分解成较小的文件,即使解析500万个XML条目也会很慢。一个好的DBA可以帮助OP。 – 2012-01-07 18:37:25

+0

@theTinMan,当然,将这么多记录发送给客户并不是一个好的选择,因此我建议分页。字母表列表的建议是提供备用导航方法。我不认为从XML文件解析会很慢,如果你有一个逻辑来直接知道要读取哪个XML文件;你不需要按顺序读取所有的XML文件 – Abhay 2012-01-09 10:13:22

+0

我不确定是谁投你失望,可能是一个缺乏理解力的人,但你的回答是合理的,并且认真考虑过,所以我为你+1了。 – 2012-01-09 21:14:00

2

在同一页面上显示所有用户和他们的书籍是不合理的。我相信,有两种可能的解决方法:

  1. 您可以为列出所有用户的用户设置索引页。对应于每个用户,您可以在“显示”页面显示用户的书籍。这将大大简化所得到的数据库查询,因为您只需要加载索引页面的用户,并且只在他/她的显示页面上加载一个用户的书籍。这意味着每次都不需要复杂的连接,也不需要大量的数据。

  2. 如果你真的想在同一页面上显示多个用户和他们的书籍,那么就像上面评论中提到的人一样,你需要使用分页,例如每页加载5个用户。但是,为了补充说明,您还需要使用热切加载,因为这很容易变成N + 1问题。您可以在“Eager loading of associations”中阅读更多内容。

回到第一种方法,您甚至可以使用分页功能;例如,列出用户或用户的书籍。

+1

正如上面评论中所说的锡人不会很沉重,如果我发送完整的500,000用户列表在一个单一的请求响应 即使我走了第二种方法,我仍然会对该页面进行500,00个数据库查询 – Ross 2012-01-07 19:19:44

2

在MySQL中具有较大偏移的查询效率较低;当评估一个偏移量为100000的查询时,MySQL必须实际找到这些100,000行并放弃它们,才能找到最终显示的十行。

解决这个问题的一个方法是给你的应用程序提示:而不是说页面10000,如果你按照主键顺序进行排序,就说它是id > x的页面。

你有合适的索引也是至关重要的。

有一个名为“Efficient Pagination Using MySQL”好文章percona.com用了各种办法,通过大集分页。