MySQL之分页屡次查询优化

    分页查询通常都会出现俩次查询,此时会有以下状况:html

  1. 要获得知足条件的那一页记录数。
  2. 要获得知足条件的总记录数。

    若是在第一个查询和第二个查询之间新增或者删除了一些数据,那么查询的结果就不许备了。我想你们都能想象这个场景,在此就不举例。mysql

    有什么解决方法,不会出现上述的问题,通过一番搜索,发现MySQL能够使用sql

    List-1spa

ELECT FOUND_ROWS();

    咱们来验证下:code

1.不带Limit的查询状况

   List-2 获得7条记录orm

mysql> select * from student where id>5;
+----+-------+------+
| id | name  | age  |
+----+-------+------+
|  8 | ??    |   20 |
|  9 | ??    |   20 |
| 10 | ??    |   20 |
| 11 | ??    |   20 |
| 12 | ??    |   20 |
| 13 | Jack  |   16 |
| 14 | Alice |   16 |
+----+-------+------+
7 rows in set (0.00 sec)

    List-3 插入一条记录,此时知足List-2条件的记录是8了htm

mysql> insert into student(name,age) values('Wenlian',25);
Query OK, 1 row affected (0.01 sec)

    List-4 获得的是7,而不是8blog

mysql> select found_rows();
+--------------+
| found_rows() |
+--------------+
|            7 |
+--------------+
1 row in set (0.01 sec)

    咱们explain来查看下"select found_rows();"文档

    List-5 type值是null,表示不须要去查询tableget

mysql> explain select found_rows();
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
| id | select_type | table | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra          |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
|  1 | SIMPLE      | NULL  | NULL       | NULL | NULL          | NULL | NULL    | NULL | NULL |     NULL | No tables used |
+----+-------------+-------+------------+------+---------------+------+---------+------+------+----------+----------------+
1 row in set, 1 warning (0.00 sec)

    

    来验证下删除的状况

    List-6  知足条件的有5条

mysql> select * from student where age=16;
+----+---------+------+
| id | name    | age  |
+----+---------+------+
|  1 | ??      |   16 |
|  2 | Steven  |   16 |
|  3 | Han     |   16 |
|  4 | Meituan |   16 |
| 13 | Jack    |   16 |
+----+---------+------+
5 rows in set (0.00 sec)

    List-7 删除一条知足List-6条件的记录

mysql> delete from student where id=1;
Query OK, 1 row affected (0.00 sec)

    List-8 即便List-7中删除了一条知足条件的记录,结果仍是5

mysql> SELECT FOUND_ROWS();
+--------------+
| FOUND_ROWS() |
+--------------+
|            5 |
+--------------+
1 row in set (0.01 sec)

2.带Limit的查询

    这里就再也不给出具体例子,看MySQL官网文档,上面有具体描述。

Reference:

  1. MySQL官网: https://dev.mysql.com/doc/refman/8.0/en/information-functions.html
  2. https://blog.sqlauthority.com/2016/04/15/mysql-found_rows-function-total-number-rows-affected/