mysql分页查询报错,及解决
mysql分页查询报错:
前提:
1.每页1000条数据
2.查到57页的时候,就报错了
以下是错误信息:
org.springframework.jdbc.UncategorizedSQLException:
### Error querying database. Cause: java.sql.SQLException:
...省略中间...
received message larger than max (18441058 vs. 16777216)
### The error may exist in sqlmap/RxOrder.xml
### The error may involve defaultParameterMap
### The error occurred while setting parameters
### SQL: SELECT ...省略中间查询... LIMIT ?,?
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:83)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:80)
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:71)
...省略后面
关于这个错误,网上几乎没有太多可用记录,最初就猜想是分页太深,导致内存满了,毕竟是内存排序,最后找公司同事确认了,就是这个原因
解决方式就是优化sql,避开深度分页
原sql:
select * from table01 where id > 1000000000000 and id < 9000000000000
limit 57000,1000
sql的目的是分页查出所有的数据,但因为分页太深,导致数据库内存爆满,查询就停止了优化方案1(单步改分步查询):
select id from table01 where id > 1000000000000 and id < 9000000000000
limit 56999,1
第一步,先查出第56999条的id
select * from table01 where id > #{id} and id < 9000000000000
limit 57000,1000
第二步,直接从这个id开始向后拿1000条优化方案2(子查询):
select id from table01 where
id > (select id from table01 where id > 1000000000000 and id < 9000000000000
limit 56999,1)
and id < 9000000000000
limit 1000
原理和优化方案1一样,只不过放在一个sql中了,但是数据量大的数据库一般都分库分表,至少也是分片,所以对子查询的支持不是很好,因业务系统而异优化方案3(分步查询唯一字段,再组装):
select id from table01 where id > 1000000000000 and id < 9000000000000
limit 57000,1000
先查出id的集合list,再遍历这个集合,分别查出每个id对应的数据,再组装起来
这样的好处是将数据库的内存压力变相的转移到服务器,一般服务器还是可以抗住的
但这样的缺点也明显,就是多了层查询,会慢些优化方案4(缩小粒度):
业务原因,原来分页是以天为最小粒度,每天是个线程,每个线程再查所有
优化的话可以考虑以小时为一个最小粒度,每个小时是一个线程,那么每个小时的数据量就没那么大了,分页也就不会太深了
总结:一切优化的根本目的都是为了避开一次性的大数据量的分页
mysql分页查询报错,及解决相关推荐
- MySQL视图查询报错:Prepared statement needs to be re-prepared
From: https://www.ywnds.com/?p=12609 今天公司的项目视图查询报错,报错如:ERROR 1615 (HY000): Prepared statement needs ...
- node.js 中Mysql 查询报错 ,解决方法。
1.报错: throw err; // Rethrow non-MySQL errors 2.问题出处 mysql\lib\protocol\Parser.js:437 抛出异样,try..catch ...
- Java分页查询报错 Every derived table must have its own alias
今天在项目中增加了一个简单的分页查询数据的接口,出现了Every derived table must have its own alias这个报错,看起来是个别名问题,但是sql很规范,该有的别名也 ...
- centos mysql 1146_MySQL查询报错:ERROR 1146 (42S02): Table 'craw.sitePageConfig' doesn't exist
今天一同事咨询mysql的问题,在mysql主库访问某个表报错, 但是备库上可以,感觉有点奇怪.即使不同步, 也不能说主库不能访问啊. 既然是主备,就从主备同步开始查.各种show master st ...
- MySQL分页查询慢的方案解决
背景 我们在开发的过程中使用分页是不可避免的,通常情况下我们的做法是使用limit加偏移量: select * from table where column=xxx order by xxx lim ...
- mysql连接服务报错1058
mysql连接服务报错1058 解决办法: 针对win10系统:控制面板–>管理工具–>服务–>mysql,找到mysql后,若发现其为禁用状态,则选中MySQL后,右击–>属 ...
- (解决)除非另外还指定了 TOP、OFFSET 或 FOR XML,否则,ORDER BY 子句在视图、内联函数、派生表、子查询和公用表表达式中无效Mybatis-plus 默认分页功能报错
(解决)除非另外还指定了 TOP.OFFSET 或 FOR XML,否则,ORDER BY 子句在视图.内联函数.派生表.子查询和公用表表达式中无效Mybatis-plus 默认分页功能报错 我百度了 ...
- mybatis查询报错:com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from string
mybatis查询报错: com.mysql.cj.exceptions.DataConversionException: Cannot determine value type from strin ...
- mysql查询新建查询报错_mysql开启慢查询报错:
1.进入mysql命令行:#mysql -uroot -p123456,执行下面的命令开启慢查询报错: set global slow_query_log=on; set global long_qu ...
最新文章
- C#调用存储过程简单完整例子
- cocos2d-x游戏实例(15)-纵版射击游戏(2)
- yum安装Docker失败No package docker available
- 天线3db波束宽度_浅谈 Wi-Fi 天线(2)
- JAVA可不可以编写应用程序_编写一个java应用程序
- 存储进阶:怎么才能保证 IO 数据的安全?
- Nginx学习之七:通过Nginx社区进行技术交流
- Elasticsearch分布式机制探究
- watir-webdriver使用过程中异常
- matlab中 mcc/mbuild/mex 区别
- Java Web之MySQL在项目中的使用
- Linux服务器更换主板后,网卡识别失败的处理方法
- python协同过滤电影推荐的论文_Netflix电影推荐系统Python实现(协同过滤+矩阵分解)...
- 如何同步修改git项目名称和本地项目名称
- Jmeter系列(32)- 详解 CSV 数据文件设置
- Java程序从编写到运行
- 【操作系统】一起了解操作系统咯 | 原码,反码,补码,你理解到位了吗?
- 记录一次利用python调用chrome爬取天眼查网址工商信息的过程
- python格式jpg转换png(批量处理,深度24,尺寸不变)
- 基于SpringBoot实现QQ机器人