php - Mysql 在发送快速请求时返回相同的行
问题描述
我发现有时 Mysql 会返回完全相同的数据(偶尔)。ig:https ://prnt.sc/10ppiyf
我有一个基本的 Php pdo 查询来为我的分页获取 Mysql 行:
$pdo->query("SELECT * from posts order by id desc LIMIT {$limit} OFFSET {$offset}");
我每 500 毫秒(以测试系统)循环发送总共 1000 个分页请求。我的测试网址是 localhost/test.php?page=1 (页面越来越多地循环到 1000)。应用服务器和数据库服务器在不同的服务器上运行。在这种情况下,请求返回的答案返回相同的行/结果(有时)。
如果 app 和 db 在相同的 Vps 上运行,则每个请求的答案都是唯一的(应该如此)。或者如果我提高了 ms (500 to 1500),那么每个请求的答案都是独一无二的。
我如何理解数据是否重复?Php 将请求数据的答案保存在一个文件中,我检查它(https://prnt.sc/10ppiyf)。
系统详情;
- Mysql 帖子表(innodb)有 +10K 行。
- 数据库和脚本在不同的 Vps 上运行。
- Vps 是 Ubuntu,Mysql 是默认安装的数据库(没有任何私有 conf)。
- 该数据库和应用程序未被任何人使用。只是我,用于读取数据(不插入),
- 当测试脚本运行时,我控制了机器 Cpu 和 Ram 没问题 (%1)。
我的测试用例如何工作;
- 节点脚本向应用服务器发送请求,例如 localhost.com/test.php?page=1 ( https://prnt.sc/10ps4ey )
- 应用服务器获取页面参数并发送一个
- 查询到数据库服务器,数据库服务器发送答案,应用服务器保存数据
- 回答一个文件。然后,我检查文件。
如果你想看我的 php 代码;
// request is sent by me automatically each 500 ms order by order 1,2,3,4
$page = (int) $_GET['page'];
if(!$page or $page == 0)
$page = 1;
$perPage = 10;
$limit = 10;
$offset = ($page * $perPage) - $perPage;
$pdo = new PDO('mysql:host=HOST;dbname=db', "user", "userp");
$pdo->query("SELECT * from posts order by id DESC LIMIT {$limit} OFFSET {$offset}");
$posts = $stm->fetchAll(PDO::FETCH_ASSOC);
亲爱的有经验的朋友,你的解决方案是什么?
更新:
我在我的网站前面使用 CloudFlare 代理(保护)。如果我禁用 CloudFlare 代理,重复数据的数量会减少。
解决方案
当在用户查看下一行/上一行之间插入或删除行时,就会发生这种情况。
解决办法是避免OFFSET
。
这是我对此类的讨论:http: //mysql.rjweb.org/doc.php/pagination
推荐阅读
- vb.net - VB.NET 服务器不接收来自远程客户端的连接请求
- php - 如何防止为在 Laravel 中同时处理的请求创建多个条目
- .net - 在 Windows 10 IOT 上运行的 .net Core 3 是否可以与 WPF 一起使用?
- node.js - Nest JS - 为返回 Observable Axios 响应的函数编写 Jest 测试用例的问题
- ocaml - 如何使用 OCaml 中的字符串格式从文件中读取数字列表
- javascript - 离子条码扫描器时间戳集成
- laravel - 在 Laravel 5.5 中保存值为 0 的数字字段
- pandas - 按元素拆分列并使用 pandas 创建新列
- python - 使用迭代 DFS 获取二叉树中节点的深度?
- ruby - 数组中奇数的总和