Performance 这种分页方式是否可以扩展?
我需要对一组可以/将要变大的模型进行分页。结果必须进行排序,以便最新的条目显示在第一页上(然后,我们可以使用“下一步”链接一直到开始) 检索第一页的查询如下所示,4是每页需要的条目数: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; 由于这需要排序,而且条目的数量可能会变得很大,我是否
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 |
+----+-------------+---------------+------+---------------+-------------+---------+------+------+-----------------------------------------------------+