前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL之分页多次查询优化 原

MySQL之分页多次查询优化 原

作者头像
克虏伯
发布2019-04-15 11:04:17
9890
发布2019-04-15 11:04:17
举报

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

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

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

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

List-1

代码语言:javascript
复制
ELECT FOUND_ROWS();

    我们来验证下:

1.不带Limit的查询情况

List-2 得到7条记录

代码语言:javascript
复制
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了

代码语言:javascript
复制
mysql> insert into student(name,age) values('Wenlian',25);
Query OK, 1 row affected (0.01 sec)

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

代码语言:javascript
复制
mysql> select found_rows();
+--------------+
| found_rows() |
+--------------+
|            7 |
+--------------+
1 row in set (0.01 sec)

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

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

代码语言:javascript
复制
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条

代码语言:javascript
复制
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条件的记录

代码语言:javascript
复制
mysql> delete from student where id=1;
Query OK, 1 row affected (0.00 sec)

List-8 即使List-7中删除了一条满足条件的记录,结果还是5

代码语言:javascript
复制
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/

(adsbygoogle = window.adsbygoogle || []).push({});

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018/07/02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.不带Limit的查询情况
  • 2.带Limit的查询
  • Reference:
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档