我们的应用报表分两个端,一个是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;