mysql中limit用法误区

本文探讨了从使用Oracle的rownumber进行分页转换到MySQL的limit语法时,参数传递不当导致的性能问题。通过分析错误代码,解释了为何limit的第二个参数不是行号的结束,而是一个取数据的数量,从而避免了后续查询返回过长结果集的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前一直用oracle,在分页的时候用rownumber,转换到mysql上之后,用limit做分页;

在做某个业务的时候,需要先将数据排序,再分页,在给limit上参数的时候沿用了oracle的rownumber方式传参,最终导致了分页查到的数据越来越多,导致响应越来越慢,最终找到了问题所在;

错误代码:

1 SELECT * FROM td_corporation_user t WHERE (t.`corp_logo` IS NOT NULL AND t.`corp_logo` <> '') AND t.`corp_user_type` = '7' ORDER BY t.`corp_member_number` asc limit 0,15;
2 
3  
4 
5 SELECT * FROM td_corporation_user t WHERE (t.`corp_logo` IS NOT NULL AND t.`corp_logo` <> '') AND t.`corp_user_type` = '7' ORDER BY t.`corp_member_number` asc limit 15,31;

 

上面的代码1是第一次请求的sql,代码2是第二次请求的sql,可以看出limit的第二个参数在递增,这个问题最终导致了第二次请求的时候返回的是排序数据中15~46条数据,一共31条数据,以此类推,以后的会更大;

启示limit的第二个参数并不是像rownumber中行号的结束,而是取多少条数据,所以limit的第二个参数是不需要变的,只需要变第一个行号的起始即可

正确代码:

1 SELECT * FROM td_corporation_user t WHERE (t.`corp_logo` IS NOT NULL AND t.`corp_logo` <> '') AND t.`corp_user_type` = '7' ORDER BY t.`corp_member_number` asc limit 0,15;
2 
3  
4 
5 SELECT * FROM td_corporation_user t WHERE (t.`corp_logo` IS NOT NULL AND t.`corp_logo` <> '') AND t.`corp_user_type` = '7' ORDER BY t.`corp_member_number` asc limit 15,15;

 

转载于:https://www.cnblogs.com/qingtingzhe/p/5262115.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值