Mysql分页查询获取totalCount大幅提升性能的办法总结
MySQL查询分页,通常在MySQL中获取记录总数都会使用SELECT COUNT(*) FROM tblName之类的语句
这类语句的缺点是:记录集还需要单独的查询来获取,相当于查询两次,推荐如下写法:
SELECT SQL_CALC_FOUND_ROWS fldName1, fldName2 FROM tblName WHERE fldName3 = 1 LIMIT 10, OFFSET 20;
SELECT FOUND_ROWS();
虽然有两条SQL语句,但实际上只执行了一次数据库查询
做分页查询中,一般情况下需要两个sql,查当前页数据 和 查记录总条数;但后者的查询结果变化有时候并不大,而且count还占用了很大一部分的查询时间;主要是想用一种省时简便的方法查询符合条件的记录总数,
查询数据使用的sql为:
SELECT SUBSTRING_INDEX(`url`,/,3)AS host,COUNT(*)AS count FROM`tab`WHERE`type`=4GROUP BY host HAVING(count>=5)ORDER BY count desc LIMIT0,10
以下是网上查到的一些尝试过的方法(不过后来都感觉不太合适,所以,亮点在最后):
方法一: 一般情况下可以使用DISTINCT来查询总数
selectcount(DISTINCT SUBSTRING_INDEX(`url`,/,3))ascfromtabwheretype=4
但是 查询数据中的sql 有 having 子句,这样得到的总数是没有经过条件筛选的。这个结果是错误的。
方法二: 通过 SQL_CALC_FOUND_ROWS 选项忽略 LIMIT 子句,然后通过FOUND_ROWS()获得查询总数,那么sql改为:
SELECT SQL_CALC_FOUND_ROWS SUBSTRING_INDEX(`url`,/,3)AS host,COUNT(*)AS count FROM`tab`WHERE`type`=4GROUP BY host HAVING(count>=5)ORDER BY count desc LIMIT0,10
再通过 select FOUND_ROWS(); 获得总数
这样获得的总数没问题,但是由于分页程序需要先获得符合条件的总数,才能生成 page_list ,以及验证offset,和总页数等信息&#