MySQL 获取分页数据的总行数,你需要选择哪种方式?

2023年 12月 19日 89.3k 0

我们的应用报表分两个端,一个是WEB端的,一个是APP端的。
APP端实现分页就是下拉翻页,没有总的合计,也没有总页数等信息,分页就简单
WEB端的都有总页数这个数据,有的列还有总的合计


如上图的箭头标注

而MySQL获取分页数据总行数共有3种方式。

第一种 SCFR方式

select SQL_CALC_FOUND_ROWS * from mysql.help_topic
order by help_topic_id limit 10;

select FOUND_ROWS();

第二种count(*)

select * from mysql.help_topic
order by help_topic_id limit 10;
select count(*) from mysql.help_topic ;

第三种 窗口函数

select *,count(*) over() from mysql.help_topic
order by help_topic_id limit 10;

那种方式更快,性能更好呢?
首先看一下官方建议

官方建议是用第二种

但我在实际的实践中,发现三种在不同场景都各有优势

SCFR方式 与 count(*) 的选择

如果你的where 条件能走索引,最好就是索引覆盖 那么用count(*)更好
如果你的where 条件不能走索引 那一定是SCFR方式更快

那什么时候用窗口函数方式

当你的报表,本身需要窗口统计总合计数的时候,就顺带统计行数了。如以下代码

select *, sum(help_category_id) over w as sum1 ,count(*) over w as cnt from mysql.help_topic
window w as ()
order by help_topic_id limit 10;

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论