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分页丢数据的分析相关推荐

  1. mysql数据库导出后乱码问题_MySQL导入导出数据出现乱码的解决办法

    在mysql导入导出数据时经常出现中文乱码的问题,大多是因类导入导出时编码设置不一致所引起的.本文介绍了不同平台下的编码转换方法,供大家参考. 在linux系统中默认的是utf8编码,而windows ...

  2. mysql数据库导入外部数据乱码么_mysql数据库导入数据时出现乱码的解决办法

    MYSQL存储数据乱码 mysql的字符集设置有多个层级,在mysql中存储中文,如果不能正确设置字符集,很容易出现数据乱码.今天就有一个用户反馈他数据库中的数据下午1点多开始出现了乱码.在这里,我分 ...

  3. mysql的分页查询用哪个关键字_MySQL 分页查询

    一.语法和公式 1.分页语法 SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT 子句可以被用于强制 SELECT ...

  4. mysql分页时获得行数_MySQL分页取得总行数新法

    SELECT语句中经常用到LIMIT限制返回行数有时候可能想要知道如果没有LIMIT会返回多少行,比如做分页的时候,但又不想再执行一次相同语句. 我们要怎么做呢? 如下 在SELECT查询中包含 SQ ...

  5. mysql恢复数据的步骤_MySQL备份恢复数据的一般步骤

    下面是备份一个数据库的例子: 1.备份前读锁定涉及的表 mysql>LOCK TABLES tbl1 READ,tbl1 READ,- 如果,你在mysqldump实用程序中使用--lock-t ...

  6. mysql更改数据库数据存储目录_MySQL更改数据库数据存储目录

    MySQL数据库默认的数据库文件位于/var/lib/mysql下,有时候由于存储规划等原因,需要更改MySQL数据库的数据存储目录.下文总结整理了实践过程的操作步骤. 1:确认MySQL数据库存储目 ...

  7. mysql 当前时间减指定时间_MySQL实现当前数据表的所有时间都增加或减少指定的时间间隔(推荐)...

    DATE_ADD() 函数向日期添加指定的时间间隔. 当前表所有数据都往后增加一天时间: UPDATE ACT_BlockNum SET CreateTime = DATE_ADD(CreateTim ...

  8. mysql 求数据的长度_mysql 如何求数据的长度

    mysql求数据长度的方法:1.使用"LENGTH"函数来获取字符串长度,语法如"SELECT LENGTH('字符')":2.通过"CHAR_LEN ...

  9. mysql 数据怎么导出_mysql怎么导出数据

    本篇文章主要介绍的是MySQL导出sql 文件,即MySQL数据库导导出sql 文件的实际操作步骤. 简单的介绍一下命令行进入mysql的方法:C:\>mysql -h hostname -u ...

最新文章

  1. 今天,开源中国出了一条广告史上最“正直”的广告
  2. 分布式存储系统设计(2)—— 数据分片
  3. stm32串口传输数据第一个数据被吞_STM32串口第一个字节丢失问题的分析过程
  4. “约见”面试官系列之常见面试题第三十九篇之异步更新队列-$nextTick(建议收藏)
  5. Robo 3T 安装连接 MongoDB
  6. 【★】电子产品降价的3大原因!
  7. 区块链 xuperchain 同步模式 纯异步模式 异步阻塞模式 怎么启动
  8. Apache VirtualHost的配置
  9. 模块二 会务现场服务策划方案 案例1样本
  10. 一线工程师如何看待《没了美国的EDA软件,我们就不能做芯片了》
  11. 【音效素材】网络热门音效大合集,短视频必备(都是经典音效,质量不错)
  12. 人全外显子组测序WES学习笔记 第一天
  13. Bzoj2959: 长跑
  14. 计算机专业的在职研究生怎么样,计算机专业在职研究生难度大吗?
  15. 计算机组成原理速成课程【速成】
  16. mysql按照中文首字母排序
  17. 985、211外,你还应该清楚这些高校联盟!
  18. 如何批量调整Word中mathtype公式的大小
  19. 人民创意联合《国家人文历史》独家首发「诗经」端午主题数字藏品
  20. python 调整字体大小

热门文章

  1. 08-GCD常用方法
  2. free movie
  3. jquery高版本全选与全部选无法正常工作
  4. 程序出错后,程序员给测试人员的20条高频回复
  5. 从贫民到百万富翁转变的心理学基础
  6. 如何在 InfoPath 2003 表单中动态加载数据
  7. PHP中session的工作原理
  8. 防火墙工作原理—Vecloud微云
  9. C++程序的多文件组成
  10. 第二阶段个人冲刺03