什么是最好的方式...考虑性能

时间:2012-01-07 17:53:39

标签: mysql ruby-on-rails ruby ruby-on-rails-3 activerecord

我的桌子中有大约5,00,000个用户,每个用户都与某些图书相关联(has_many)

我希望显示所有用户及其图书....

我不会在同一页面中显示所有用户,它们将被分页。

执行此操作的最佳方法是什么,保持性能,数据库命中率。处理大量记录时需要考虑的所有事情。

3 个答案:

答案 0 :(得分:2)

在同一页面上显示所有用户及其图书是不合理的。我认为,有两种可能的解决方法:

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

  2. 如果您真的想在同一页面上显示多个用户及其图书,那么就像上面评论中提到的那样,您需要使用分页,比如每页加载5个用户。但是,要添加它,您还需要使用预先加载,因为这很容易变成N + 1问题。您可以在“Eager loading of associations”中阅读更多内容。

  3. 回到第一种方法,你甚至可以使用分页;例如,列出用户甚至是用户的书籍。

答案 1 :(得分:2)

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

解决此问题的一种方法是提供您的应用程序提示:如果您按主键顺序排序,则不要说页面10000,而是说它是id > x的页面。

拥有合适的索引也很重要。

在percona.com上有一篇名为“Efficient Pagination Using MySQL”的好文章,提供了大量分组的方法。

答案 2 :(得分:0)

几点想法 -

MySQL非常聪明,可以处理这么多记录。您可以在一个查询中阅读所有用户及其书籍,然后根据需要显示它们。但是,在单个网页上显示这些记录会影响响应时间。

因此分页 - 每页读取有限的记录。虽然这意味着每页SQL查询但仍然进行了优化。当然,您可以使用一些查询缓存。

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

我不确定您的网站尽快显示最新更新有多重要,但您也可以考虑生成XML文件,就像您需要的那样多,例如按字母顺序排列并从XML文件生成您的网页。您可以每24小时更新一次这些XML文件。所以,最小DB负载。

请考虑构建搜索,因为浏览这些用户可能会令人沮丧。

希望它有所帮助!