1 有问题的代码
CleverCode发现在mysql有分页丢失数据的问题。如下面的代码,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的内容,更多相关内容请关注PHP中文网(www.php.cn)!

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于架构原理的相关内容,MySQL Server架构自顶向下大致可以分网络连接层、服务层、存储引擎层和系统文件层,下面一起来看一下,希望对大家有帮助。

在mysql中,可以利用char()和REPLACE()函数来替换换行符;REPLACE()函数可以用新字符串替换列中的换行符,而换行符可使用“char(13)”来表示,语法为“replace(字段名,char(13),'新字符串') ”。

mysql的msi与zip版本的区别:1、zip包含的安装程序是一种主动安装,而msi包含的是被installer所用的安装文件以提交请求的方式安装;2、zip是一种数据压缩和文档存储的文件格式,msi是微软格式的安装包。

方法:1、利用right函数,语法为“update 表名 set 指定字段 = right(指定字段, length(指定字段)-1)...”;2、利用substring函数,语法为“select substring(指定字段,2)..”。

转换方法:1、利用cast函数,语法“select * from 表名 order by cast(字段名 as SIGNED)”;2、利用“select * from 表名 order by CONVERT(字段名,SIGNED)”语句。

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了关于MySQL复制技术的相关问题,包括了异步复制、半同步复制等等内容,下面一起来看一下,希望对大家有帮助。

本篇文章给大家带来了关于mysql的相关知识,其中主要介绍了mysql高级篇的一些问题,包括了索引是什么、索引底层实现等等问题,下面一起来看一下,希望对大家有帮助。

在mysql中,可以利用REGEXP运算符判断数据是否是数字类型,语法为“String REGEXP '[^0-9.]'”;该运算符是正则表达式的缩写,若数据字符中含有数字时,返回的结果是true,反之返回的结果是false。


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

드림위버 CS6
시각적 웹 개발 도구

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

Eclipse용 SAP NetWeaver 서버 어댑터
Eclipse를 SAP NetWeaver 애플리케이션 서버와 통합합니다.

mPDF
mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기
