Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.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
Performance 这种分页方式是否可以扩展?_Performance_Ruby On Rails 3_Will Paginate - Fatal编程技术网

Performance 这种分页方式是否可以扩展?

Performance 这种分页方式是否可以扩展?,performance,ruby-on-rails-3,will-paginate,Performance,Ruby On Rails 3,Will Paginate,我需要对一组可以/将要变大的模型进行分页。结果必须进行排序,以便最新的条目显示在第一页上(然后,我们可以使用“下一步”链接一直到开始) 检索第一页的查询如下所示,4是每页需要的条目数: SELECT "relationships".* FROM "relationships" WHERE ("relationships".followed_id = 1) ORDER BY created_at DESC LIMIT 4 OFFSET 0; 由于这需要排序,而且条目的数量可能会变得很大,我是否

我需要对一组可以/将要变大的模型进行分页。结果必须进行排序,以便最新的条目显示在第一页上(然后,我们可以使用“下一步”链接一直到开始)

检索第一页的查询如下所示,4是每页需要的条目数:

 SELECT "relationships".* FROM "relationships" WHERE ("relationships".followed_id = 1) ORDER BY created_at DESC LIMIT 4 OFFSET 0;
由于这需要排序,而且条目的数量可能会变得很大,我是否会遇到严重的性能问题

我有什么办法可以加快速度


我的理解是,“followed_id”上的索引只会帮助where子句。我关心的是“order by”

创建一个包含这两个字段的索引,其顺序为
(后面是id,创建时间)

现在,我们在这里讨论的那个大的有多大?如果是几百万的话。。像下面这样的怎么样

在关键字
上创建一个索引,后跟\u id、created\u at、id
(这可能会根据select、where和order by子句中的字段而变化。我已经为您的问题定制了此索引)

一个解释会得出这样的结论:

+----+-------------+---------------+------+---------------+-------------+---------+------+------+-----------------------------------------------------+
| id | select_type | table         | type | possible_keys | key         | key_len | ref  | rows | Extra                                               |
+----+-------------+---------------+------+---------------+-------------+---------+------+------+-----------------------------------------------------+
|  1 | PRIMARY     | NULL          | NULL | NULL          | NULL        | NULL    | NULL | NULL | Impossible WHERE noticed after reading const tables |
|  2 | DERIVED     | relationships | ref  | sample_rel2   | sample_rel2 | 5       |      |    1 | Using where; Using index                            |
+----+-------------+---------------+------+---------------+-------------+---------+------+------+-----------------------------------------------------+
如果仔细检查,包含order、limit和offset子句的子查询将直接对索引而不是表进行操作,并最终与表连接以获取10条记录

当您的查询在某一点执行类似于
limit 10 offset 10000
的调用时,情况会有所不同。它将从表中检索所有10000条记录,并获取前10条记录。这个技巧应该将遍历限制为只遍历索引


一个重要提示:我在MySQL中测试了这个。其他数据库可能在行为上存在细微的差异,但无论发生什么情况,这个概念都适用。

您可以为这些字段编制索引。但这取决于: 您可以假设(大部分情况下)已订购创建的_。所以这可能是不必要的。但这更多取决于你的应用程序

无论如何,您应该索引后面的\u id(除非它是主键)

+----+-------------+---------------+------+---------------+-------------+---------+------+------+-----------------------------------------------------+
| id | select_type | table         | type | possible_keys | key         | key_len | ref  | rows | Extra                                               |
+----+-------------+---------------+------+---------------+-------------+---------+------+------+-----------------------------------------------------+
|  1 | PRIMARY     | NULL          | NULL | NULL          | NULL        | NULL    | NULL | NULL | Impossible WHERE noticed after reading const tables |
|  2 | DERIVED     | relationships | ref  | sample_rel2   | sample_rel2 | 5       |      |    1 | Using where; Using index                            |
+----+-------------+---------------+------+---------------+-------------+---------+------+------+-----------------------------------------------------+