我们在开发过程中难免会遇到全差带分页的写法,今天在开发过程中遇到一个函数另一种写法也是我们在平常开发中不常见的,那就是**FOUND_ROWS()**函数
全查带分页
Content:select * from Teacher where t_id>10 limit 4,15;
TotalCount:select count(1) Teacher where t_id>10;
(用COUNT(id)或COUNT(1)就不用查询所有,通过自增id或指定随机一列用来返回记录数,查询效率更高,这里的效率高并不是指时间成本)但是当我们的查询条件多了以后比如说这样
select * from Teacher where t_id>0 and t_type=102 and t_in_time>='2019-12-02'以此类推,随着查询条件的不断增多我们查询的效率也随之降低,时间成本也在不断上升,那么我们可以在第二次查询总条数的found_rows()函数去写。
Content:select sql_calc_found_rows * from Teacher where t_id>10 limit 4,15;
TotalCount:select found_rows();
FOUND_ROWS():记录上一条 sql查询的select 查询的行数(FOUND_ROWS()函数要配合SQL_CALC_FOUND_ROWS一起使用)
用SQL_CALC_FOUND_ROWS告诉MySQL将sql处理的数记下来,再用FOUND_ROWS()方法取到这个记录,虽然也是两个语句,但是就获取分页前总数而言只执行了一次主查询,所以效率比COUNT()要高很多,这个方法的好处就是他记录的是分页前的总条数,不需要再将LIMIT去掉;
同时FOUND_ROWS()函数有利必有弊,又取必有失,记录的是上一条select语句执行的sql,如果是在并发环境中,不加以控制的话,基本取不到正确的值,但是用事务控制的话又很影响性能,所以最好是连着使用。
如果要测试的话,不要使用navicat 之类的工具测试,那样会影响数据的准确性。
两者相比较而言:当where限制条件多时使用FOUND_ROWS()方法,没有where限制时使用COUNT()方法会更快;覆盖索引时使用FOUND_ROWS()性能高,无覆盖索引使用COUNT()性能高;