在mysql中翻页是不是有比LIMIT OFFSET更好的选择

在mysql中翻页是不是有比LIMIT OFFSET更好的选择,第1张

以前在数据中写翻页的代码时,一直把sql写成这样

SELECT * FROM table_name ORDER BY id ASC LIMIT 10 OFFSET 10

也就是用LIMIT和OFFSET来控制需要输出的内容区域,后来我在翻其他人代码时看到了这种写法

SELECT * FROM table_name WHERE id >10 ORDER BY id ASC LIMIT 10

这种写法是否比前一种写法的速度要更快,因我看到它使用id主键的索引,而且还把检索区域用id >10缩小了,理论上应该更快。但这种写法应该也有一定的局限性,比如最大的局限就是它只能用于那种类似timeline的,从第一页往后翻的应用场景,因为你要翻下一页必须知道前一页的最后偏移是多少。

不知道我这样的分析是否正确,各位有什么样的看法。

mysql有limit好像比较给力,分页也不是很难。

public class PageInfo implements Serializable {

private static final long serialVersionUID = 1365747893051987016L

private int pageSize = 10// 每页显示10行,可自行调节

private int recordCount// 总行数

private int pageCount// 总页数

private int pageId// 当前页

private int startIndex// 当前页的开始行数

private int endIndex// 当前页的结束行数

private List items//当前页数据

public PageInfo() {

}

public int getPageSize() {

return pageSize

}

public void setPageSize(int pageSize) {

this.pageSize = pageSize

}

public int getRecordCount() {

return recordCount

}

public void setRecordCount(int recordCount) {

this.recordCount = recordCount

}

public int getPageCount() {

return pageCount

}

public void setPageCount(int pageCount) {

this.pageCount = pageCount

}

public int getPageId() {

return pageId

}

public void setPageId(int pageId) {

this.pageId = pageId

}

public int getStartIndex() {

return startIndex

}

public void setStartIndex(int startIndex) {

this.startIndex = startIndex

}

public int getEndIndex() {

return endIndex

}

public void setEndIndex(int endIndex) {

this.endIndex = endIndex

}

public List getItems() {

return items

}

public void setItems(List items) {

this.items = items

}

}

翻页直接对pageId(当前页)进行加减就可以了,有当前页开始行数,你直接

limit(startIndex-1)*pageSize,pageSize)就可以了

1、首先我们建立一个表表的数据,这个表里有25条数据,id从1到25。(下图是部分截图)

2、要分页数据,首先我们假设一页有10条数据,我们可以用mysql的limit关键字来限定返回多少条数据。并且用orderby来排序数据,这里用id来排序。所以第一页的sql可以如图这样写。

3、执行后得到的数据如图,就是id从1到10的前10条数据,因为我们是按id升序来排序的。

4、上面第一页的sql是简化的写法,完整的写法如图,得到的结果和上图的一模一样。代码里limit0,10的意思是从第一条数据开始,取10条数据。(注意的是第一条数据是从0开始的)

5、那么第二页的数据,关键是要知道是从哪一条数据开始,可以用这个公式得到:(页码-1) *每页显示多少条,即(2-1)*10=10,所以sql语句如图,limit10,10。

6、执行后,结果正确,得到id从11到20的10条数据。

7、同理第三页数据的sql如图,<br/>就是limit20,10。

8、查询的结果如图,因为这页只剩下5条数据了,所以只显示5条数据。如果你有更多页的数据,后面的数据只需要按上面的公式,得到从哪行开始,就可以写对应的sql语句了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8660652.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存