当前位置: 首页 > news >正文

SQL_CALC_FOUND_ROWS 和 FOUND_ROWS()实现对复杂sql实现分页与总条数查询

需求

ReturnResult result = new ReturnResult();
try {List<Map> forList = (List<Map>) dao.findForList("Mapper.getList", map);int count = (int) dao.findForObject("Mapper.getCount", map);result.setData(forList);result.setCode(0);result.setFlag(true);result.setCount(count);
} catch (Exception e) {result.setCode(0);result.setMessage(e.getMessage());result.setFlag(false);
}
return result;

以上代码运行速度缓慢,当数据量过大时,运行时间超过20秒。优化运行速度。

思路

这段代码看起来逻辑非常简通过dao调用了两次Mapper中的SQL语句,第一次通过map将条件及页码传入,查询出对应页码的数据。
第二次将sql中的limit去除,实现查询全部数据。
首先使用explain查看语句是否走索引。经测试sql有部分条件没有索引,将索引添加完毕后速度有了质的提高。
但查看sql语句,发现两段调用sql几乎相同,运行时间也相同,java程序顺序执行,及执行时间翻倍。使用SQL_CALC_FOUND_ROWSFOUND_ROWS()可以解决该问题。

使用及完整代码

利用 SQL_CALC_FOUND_ROWSFOUND_ROWS()关键字。以下是具体的 SQL 查询方法:

  1. 使用 SQL_CALC_FOUND_ROWSSQL 查询

    SELECT SQL_CALC_FOUND_ROWS *
    FROM table
    WHERE 查询条件
    LIMIT 页码, 条数;
    

·*·代表需要查询出的字段。
2. 使用FOUND_ROWS()获取总条数

   SELECT FOUND_ROWS();

SQL_CALC_FOUND_ROWS 会计算符合条件的总行数,而不受 LIMIT 的影响。FOUND_ROWS() 会返回上一个查询的结果总数。

Java 代码实现

ReturnResult result = new ReturnResult();
try {// 获取分页数据List<Map> forList = (List<Map>) dao.findForList("Mapper.getList", map);// 获取总条数int count = (int) dao.findForObject("Mapper.getCount");result.setData(forList);result.setCode(0);result.setFlag(true);result.setCount(count);
} catch (Exception e) {result.setCode(0);result.setMessage(e.getMessage());result.setFlag(false);
}
return result;

Mapper XML

<!-- 获取分页数据并计算总条数 -->
<select id="getList" parameterType="map" resultType="map">SELECT SQL_CALC_FOUND_ROWS *FROM tableWHERE 查询条件LIMIT 页码, 条数;
</select><!-- 获取总条数 -->
<select id="getCount" resultType="int">SELECT FOUND_ROWS();
</select>

相关文章:

  • React实现H5手势密码
  • 水电站机组振动摆度在线监测系统详解
  • 南开大学漏洞报送证书【文尾有福利】
  • C#.Net筑基-集合知识全解
  • 《python》paramiko+paramiko实现远程通过ssh通道连接数据库
  • Spring MVC学习记录(基础)
  • leaflet,canvas渲染目标,可加载大批量数据
  • 配电室数据中心巡检3d可视化搭建的详细步骤
  • OCC介绍及框架分析
  • 在vue和uniapp中使用 websocket并封装js
  • Android GLES渲染——渲染回读
  • MFC序列号输入框
  • 一套轻量、安全的问卷系统基座,提供面向个人和企业的一站式产品级解决方案
  • K-Means 算法详解
  • 游戏中的寻路算法研究
  • 【css3】浏览器内核及其兼容性
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • const let
  • hadoop集群管理系统搭建规划说明
  • Java 23种设计模式 之单例模式 7种实现方式
  • JavaScript 基础知识 - 入门篇(一)
  • javascript面向对象之创建对象
  • mac修复ab及siege安装
  • ng6--错误信息小结(持续更新)
  • Vim 折腾记
  • vuex 学习笔记 01
  • 关于 Cirru Editor 存储格式
  • 基于组件的设计工作流与界面抽象
  • 简单实现一个textarea自适应高度
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 使用权重正则化较少模型过拟合
  • 系统认识JavaScript正则表达式
  • 写给高年级小学生看的《Bash 指南》
  • 2017年360最后一道编程题
  • ​如何使用QGIS制作三维建筑
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • ()、[]、{}、(())、[[]]命令替换
  • (07)Hive——窗口函数详解
  • (1)Jupyter Notebook 下载及安装
  • (9)STL算法之逆转旋转
  • (Java)【深基9.例1】选举学生会
  • (Redis使用系列) SpringBoot中Redis的RedisConfig 二
  • (不用互三)AI绘画:科技赋能艺术的崭新时代
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (面试必看!)锁策略
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (四)模仿学习-完成后台管理页面查询
  • (新)网络工程师考点串讲与真题详解
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)平衡树