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 限制的主要内容,如果未能解决你的问题,请参考以下文章