暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

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

原创 aisql 2023-12-18
675

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

image.png
如上图的箭头标注

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

第一种 SCFR方式

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

image.png

第二种count(*)

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

image.png

第三种 窗口函数

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

image.png

那种方式更快,性能更好呢?
首先看一下官方建议
image.png
官方建议是用第二种

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

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;

image.png

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论