mysql分页er_MySQL之分页多次查询优化

在MySQL中,分页查询通常涉及两次查询,可能导致数据不准确。为解决这个问题,可以使用FOUND_ROWS()函数。当在不带LIMIT的查询后调用此函数,它会返回满足条件的记录数,即使在两次查询间数据有增减,也能保证结果正确。例如,通过示例展示了在插入或删除记录后,FOUND_ROWS()仍能提供准确的记录数。
摘要由CSDN通过智能技术生成

分页查询一般都会出现俩次查询,此时会有如下情况:

要得到满足条件的那一页记录数。

要得到满足条件的总记录数。

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

有什么解决方法,不会出现上述的问题,经过一番搜索,发现MySQL可以使用

List-1

ELECT FOUND_ROWS();

我们来验证下:

1.不带Limit的查询情况

List-2得到7条记录

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了

mysql> insert into student(name,age) values('Wenlian',25);

Query OK, 1 row affected (0.01 sec)

List-4得到的是7,而不是8

mysql> select found_rows();

+--------------+

| found_rows() |

+--------------+

| 7 |

+--------------+

1 row in set (0.01 sec)

我们explain来查看下"select found_rows();"

List-5type值是null,表示不需要去查询table

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:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值