mysql实现分页sql报错_mysql分页sql基本原理

1 mysql分页原理

假设数据库表student存在13条数据。

语句1:select * from student limit 9,4

语句2:slect * from student limit 4 offset 9

// 语句1和2均返回表student的第10、11、12、13行

//语句1中的4表示返回4行,9表示从表的第十行开始

//语句2中的4表示返回4行,9表示从表的第十行开始

通过limit和offset 或只通过limit可以实现分页功能

假设 numberperpage 表示每页要显示的条数

pagenumber表示页码

那么 返回第pagenumber页,每页条数为numberperpage的sql语句写法为

语句3:select * from studnet limit (pagenumber-1)*numberperpage,numberperpage

语句4:select * from student limit numberperpage offset (pagenumber-1)*numberperpage

2 mysql limit优化

MySQL limit 操作常用于程序中的分页,但是如果你没有了解过limit的机制和相关优化原理,一旦数据量上升,程序的性能将会惨不忍睹,所以下面总结几种mysql关于limit优化实例,每个实例后对应都会有演示。(演示的数据来自15年暑期实习的p2p流量数据,表数据量约300W行)

1、sql中会范的错误

selectXXXfromtableA  limit 1000000,10;

上面的语句是取1000000后面的10条记录,但是这样会导致mysql将1000000之前的所有数据全部扫描一次,大量浪费了时间。截图是我扫描100W数据花费的时间,大概是2S多

05b607eb9edf1fbd3fe6a9dfebecefe0.png

这在程序中肯定是不可忍受的。

对于mysql,优化limit最重要的一点就是尽量先用主键id的索引到起始位置,然后再截取需要的行数。

2、优化方式

(1)使用记录主键的方式进行优化

limit最大的问题在于要扫描前面不必要的数据,所以可以先对主键的条件做设定,然后记录住主键的位置再取行。

select*fromp2p_20131230wheremain_id > 1000000orderbymain_id  limit 10;

这样执行的结果如下所示,比没有优化前提升了很多倍。

26a4bc712c1adfdb8ba89114c9f30a4d.png

(2)使用子查询进行查询:

select*fromp2p_20131230wheremain_id >= (selectmain_idfromp2p_20131230 limit 1000000,1) limit 10;

ff6fdf7436c3b2cbc7665450e0c39e1b.png

(3) 使用between关键字

如果在主键id是有序不变的情况下,还可以手动计算between的前后两个条件进行查询,这里我就不上代码了。

总结一下,上面的集中方法都是利用mysql的主键索引进行优化,当然应用中通常很难直接获得索引,基本上都是格局where后的某个条件,这个时候就可以先用条件查询出主键id,然后再用上述方式获取结果集即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值