Codeigniter 分页避免使用 OFFSET 限制

Posted

技术标签:

【中文标题】Codeigniter 分页避免使用 OFFSET 限制【英文标题】:Codeigniter pagination avoid LIMIT with OFFSET 【发布时间】:2011-11-01 23:19:27 【问题描述】:

在 codeigniter 分页检索行时,是否有避免使用 LIMIT $page,$offset 的方法?

当我在检索例如 LIMIT 300000,45 时对 milions 记录使用带偏移量的限制时,查询需要大约 6 秒,然后检索 LIMIT 45,45

对记录进行分页的最佳和最快方法是什么?

谢谢:)

我的桌子是这样的:

id(自动)|用户名 |密码 |电子邮件

我使用了一个简单的查询:

SELECT * FROM table ORDER_BY username ASC LIMIT 300000,45

【问题讨论】:

您的表是什么样的,您使用的 SQL 是什么(包括与 LIMIT 一起使用的 ORDER BY 子句),以及您定义了哪些索引? 【参考方案1】:

LIMIT 45, 45 的情况下,您选择了偏移量为 45 的 45 行,而LIMIT 45, 300000 限制了偏移量 45 的 300000 行。这可以解释速度问题。

【讨论】:

【参考方案2】:

不幸的是,由于限制的工作原理,您基本上需要遍历结果集并找到第 N 项(在本例中为 300,000)。这是一个 O(n) 操作。当然,它是通过数据库完成的,所以效率要高得多,但仍然是 O(n),100 万的偏移量仍然会比 1 的偏移量慢。

现在,您可以通过在用户名上放置索引来加快速度。我的猜测是目前没有一个,这将解释两次之间的一些差异,但无论如何你仍然需要查看 300k 记录,所以即使 c 在 O(C *n),它仍然是 O(n)。

【讨论】:

是的,我添加了索引,现在更好,但仍然很慢,偏移量为 100 万:P

以上是关于Codeigniter 分页避免使用 OFFSET 限制的主要内容,如果未能解决你的问题,请参考以下文章

CodeIgniter分页不起作用(在其他页面中)

CodeIgniter 3分页不起作用

mysql分页查询优化

使用 codeigniter 和 jquery 进行 AJAX 分页

时区和夏令时 CodeIgniter

如何使用 codeigniter 分页库回显页码?