mysql 分页有数据没了_mysql分页丢数据的分析
1 有问题的代码
如下面的代码,system_user表有400万行数据,这时候需要把这张表里面的所有的userid取出来。这时候只能分页取,一次取2万。
//系统用户表(400万行的数据)
$systemUserTable = new systemUserTable();
// 每次取20000
$pageSize = 20000;
for($curPage = 1;; $curPage++) {
$sql = "select userid from system_user order by userid asc limit " . (($curPage - 1) * $pageSize) . "," . $pageSize;
//取数据
$rows = $systemUserTable->fetchAll($sql);
// 没有数据了,结束
if (empty($rows)) {
break;
}
// 遍历数据
foreach ( $rows as $key => $val ) {
$userid = $val['userid'];
echo $userid."\r\n";
}
}
2 问题分析 1)假如system_user只有10行数据(u1,u2,u3,u4,u5,u6,u7,u8,u9,u10)。
2) 这时候每次取5行。分2两次取。
3)正常情况第一页取(u1,u2,u3,u4,u5),正常情况第二页取(u6,u7,u8,u9,u10)。
4)如果在第一页去完,第二页取之前的时间间隙里面。u2,u3被删除了。
5)那么第二页取的时候。数据变成了(u1,u4,u5,u6,u7,u8,u9,u10)。
6)那么取出来第二页的数据就变成了(u8,u9,u10)。
7)u6,u7被丢失了。
3 解决方案 每次取的时候where带着最大偏移量。如下面的代码。
$systemUserTable = new systemUserTable();
// 每次取20000
$pageSize = 20000;
// 每页最大编号
$pageMaxId = 0;
while ( 1 ) {
$sql = "select userid from system_user where userid > ${pageMaxId} order by userid asc limit " . $pageSize;
//取数据
$rows = $fyHouse->fetchAll($sql);
// 没有数据,结束
if (empty($rows)) {
break;
}
// 遍历数据
foreach ( $rows as $key => $val ) {
$userid = $val['userid'];
// 记录当前最大分页编号
if ($userid > $pageMaxId) {
$pageMaxId = $userid;
}
echo $userid."\r\n";
}
}
过程分析: 1)system_user只有10行数据(u1,u2,u3,u4,u5,u6,u7,u8,u9,u10)。 2) 第一次取,最大偏移量0,limit 5;则取出(u1,u2,u3,u4,u5)。记录最大的偏移量u5的值。 4)如果在第一页去完,第二页取之前的时间间隙里面。u2,u3被删除了。 5)那么第二页取的时候。数据变成了(u1,u4,u5,u6,u7,u8,u9,u10)。 3)第二次取,最大偏移量u5,limit 5;则取出(u6,u7,u8,u9,u10)。记录最大的偏移量u10的值。
mysql 分页有数据没了_mysql分页丢数据的分析相关推荐
- mysql数据库导出后乱码问题_MySQL导入导出数据出现乱码的解决办法
在mysql导入导出数据时经常出现中文乱码的问题,大多是因类导入导出时编码设置不一致所引起的.本文介绍了不同平台下的编码转换方法,供大家参考. 在linux系统中默认的是utf8编码,而windows ...
- mysql数据库导入外部数据乱码么_mysql数据库导入数据时出现乱码的解决办法
MYSQL存储数据乱码 mysql的字符集设置有多个层级,在mysql中存储中文,如果不能正确设置字符集,很容易出现数据乱码.今天就有一个用户反馈他数据库中的数据下午1点多开始出现了乱码.在这里,我分 ...
- mysql的分页查询用哪个关键字_MySQL 分页查询
一.语法和公式 1.分页语法 SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT 子句可以被用于强制 SELECT ...
- mysql分页时获得行数_MySQL分页取得总行数新法
SELECT语句中经常用到LIMIT限制返回行数有时候可能想要知道如果没有LIMIT会返回多少行,比如做分页的时候,但又不想再执行一次相同语句. 我们要怎么做呢? 如下 在SELECT查询中包含 SQ ...
- mysql恢复数据的步骤_MySQL备份恢复数据的一般步骤
下面是备份一个数据库的例子: 1.备份前读锁定涉及的表 mysql>LOCK TABLES tbl1 READ,tbl1 READ,- 如果,你在mysqldump实用程序中使用--lock-t ...
- mysql更改数据库数据存储目录_MySQL更改数据库数据存储目录
MySQL数据库默认的数据库文件位于/var/lib/mysql下,有时候由于存储规划等原因,需要更改MySQL数据库的数据存储目录.下文总结整理了实践过程的操作步骤. 1:确认MySQL数据库存储目 ...
- mysql 当前时间减指定时间_MySQL实现当前数据表的所有时间都增加或减少指定的时间间隔(推荐)...
DATE_ADD() 函数向日期添加指定的时间间隔. 当前表所有数据都往后增加一天时间: UPDATE ACT_BlockNum SET CreateTime = DATE_ADD(CreateTim ...
- mysql 求数据的长度_mysql 如何求数据的长度
mysql求数据长度的方法:1.使用"LENGTH"函数来获取字符串长度,语法如"SELECT LENGTH('字符')":2.通过"CHAR_LEN ...
- mysql 数据怎么导出_mysql怎么导出数据
本篇文章主要介绍的是MySQL导出sql 文件,即MySQL数据库导导出sql 文件的实际操作步骤. 简单的介绍一下命令行进入mysql的方法:C:\>mysql -h hostname -u ...
最新文章
- 今天,开源中国出了一条广告史上最“正直”的广告
- 分布式存储系统设计(2)—— 数据分片
- stm32串口传输数据第一个数据被吞_STM32串口第一个字节丢失问题的分析过程
- “约见”面试官系列之常见面试题第三十九篇之异步更新队列-$nextTick(建议收藏)
- Robo 3T 安装连接 MongoDB
- 【★】电子产品降价的3大原因!
- 区块链 xuperchain 同步模式 纯异步模式 异步阻塞模式 怎么启动
- Apache VirtualHost的配置
- 模块二 会务现场服务策划方案 案例1样本
- 一线工程师如何看待《没了美国的EDA软件,我们就不能做芯片了》
- 【音效素材】网络热门音效大合集,短视频必备(都是经典音效,质量不错)
- 人全外显子组测序WES学习笔记 第一天
- Bzoj2959: 长跑
- 计算机专业的在职研究生怎么样,计算机专业在职研究生难度大吗?
- 计算机组成原理速成课程【速成】
- mysql按照中文首字母排序
- 985、211外,你还应该清楚这些高校联盟!
- 如何批量调整Word中mathtype公式的大小
- 人民创意联合《国家人文历史》独家首发「诗经」端午主题数字藏品
- python 调整字体大小