欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 创投人物 > SQL_CALC_FOUND_ROWS 和 FOUND_ROWS()实现对复杂sql实现分页与总条数查询

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

2024/10/24 3:24:47 来源:https://blog.csdn.net/weixin_45049746/article/details/139814118  浏览:    关键词: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>

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com