`
faiinlove
  • 浏览: 57735 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Mysql Limit 出现误差?

    博客分类:
  • php
阅读更多

在一段更新数据库的代码中,居然出现了虚假的更新动作。

数据库用的是MySql,测试环境是局域网,4核机器,Mysql无事务机制,无存储过程;PHP5.2.x。

 

这段代码需要更新超过300条记录。

每次更新完自己后,需要调用JobManage::synchroJobStatus做同步,同步过程中有一次数据库操作。

 

 <?php
$ibegin=0;
while (true) {
$sql = "SELECT JI_ID FROM tb_job_info WHERE JI_CompanyID={$companyID} LIMIT {$ibegin},100";
$jobList = DB::sql($sql, DBName_company);

 if (empty($jobList)) {
	break;
 }

foreach ($jobList as $job){
	$data = array(
		'JS_IsAdminChecked'   => $status,
		'JS_AdminCheckedRemark' => $remark,
		'JS_AdminCheckedTime' => time(),
	);

$where = array('JS_JobID' => $job["JI_ID"]);
$statusInfo = DB::getRow('tb_job_status', $where, DBName_company,'JS_JobID');
if(empty($statusInfo)){
	$iRnt = $this->addJobStatus($job['JI_ID'],$status,$remark);
	if($iRnt<0){
		return 0;
	}
}
$iRtn += DB::edit('tb_job_status', $data, $where, DBName_company);
$statusInfo = array_merge($statusInfo,$data);

$data = array(
	'LC_Type' => $isAdminCheck,
	'LC_AdminID'=>$checkAdminID,
	'LC_CheckStatus' => $status,
	'LC_HitWords'  => $remark,
	'LC_UpdateTime' => time()
);
$where = array('LC_CompanyID' => $companyID,'LC_JobID' =>$job["JI_ID"]);
$exist = DB::getRow('tb_log_checkjob',$where,DBName_company,'LC_CompanyID');
if(!empty($exist)){
	DB::edit('tb_log_checkjob',$data,$where,DBName_company);
}else{
	$data = array_merge($data,$where,array('LC_AddTime' => time()));
	$result = DB::add('tb_log_checkjob',$data,DBName_company);
}

JobManage::synchroJobStatus($statusInfo);
}

 $ibegin+=100;

 }
?>

更新的语句关键是这条:DB::edit('tb_job_status', $data, $where, DBName_company);

 上面的问题是:

1.查询数据库,一轮300多条记录中,有100多条记录的该语句没有生效。
2.这条语句每次都返回了更新成功。

3.数据能够完整的读取,没有遗漏。

 

经过修改:

 <?php
//$ibegin=0;
//while (true) {
$sql = "SELECT JI_ID FROM tb_job_info WHERE JI_CompanyID={$companyID}";// LIMIT {$ibegin},100";
$jobList = DB::sql($sql, DBName_company);

 //if (empty($jobList)) {
//	break;
 //}

foreach ($jobList as $job){
	$data = array(
		'JS_IsAdminChecked'   => $status,
		'JS_AdminCheckedRemark' => $remark,
		'JS_AdminCheckedTime' => time(),
	);

$where = array('JS_JobID' => $job["JI_ID"]);
$statusInfo = DB::getRow('tb_job_status', $where, DBName_company,'JS_JobID');
if(empty($statusInfo)){
	$iRnt = $this->addJobStatus($job['JI_ID'],$status,$remark);
	if($iRnt<0){
		return 0;
	}
}
$iRtn += DB::edit('tb_job_status', $data, $where, DBName_company);
$statusInfo = array_merge($statusInfo,$data);

$data = array(
	'LC_Type' => $isAdminCheck,
	'LC_AdminID'=>$checkAdminID,
	'LC_CheckStatus' => $status,
	'LC_HitWords'  => $remark,
	'LC_UpdateTime' => time()
);
$where = array('LC_CompanyID' => $companyID,'LC_JobID' =>$job["JI_ID"]);
$exist = DB::getRow('tb_log_checkjob',$where,DBName_company,'LC_CompanyID');
if(!empty($exist)){
	DB::edit('tb_log_checkjob',$data,$where,DBName_company);
}else{
	$data = array_merge($data,$where,array('LC_AddTime' => time()));
	$result = DB::add('tb_log_checkjob',$data,DBName_company);
}

JobManage::synchroJobStatus($statusInfo);
}

 //$ibegin+=100;

 //}
?>

 

问题不再存在· · 

何种原因,导致这个错误出现呢?

初步断定 Limit 出现了这个误差!

具体如何产生的,还有待分析。

 

0
0
分享到:
评论

相关推荐

    MYSQL分页limit速度太慢的优化方法

    MySQL中的分页查询是Web应用中常见的操作,但随着数据量的增长,`LIMIT`语句在处理大量数据时性能会显著下降。特别是当`OFFSET`值增大时,MySQL需要扫描更多的行来找到需要的数据,这可能导致查询速度变慢,甚至对...

    mysql分页的limit参数简单示例

    Mysql的分页的两个参数 select * from user limit 1,2 ... 您可能感兴趣的文章:详解MySQL的limit用法和分页查询语句的性能分析MYSQL分页limit速度太慢的优化方法mysql limit分页优化方法分享Mysql limit

    关于Mysql分页的两种方法,假分页和limit分页

    相比之下,LIMIT分页是MySQL数据库内置的分页机制,它在服务器端直接处理分页,只返回所需页面的数据。LIMIT关键字与ORDER BY一起使用,可以实现高效的数据分页。例如,`SELECT * FROM table ORDER BY column LIMIT ...

    mybatis连接MySQL8出现的问题解决方法

    "mybatis连接MySQL8出现的问题解决方法" MyBatis是当前最流行的持久层框架之一,它提供了一个简单的方式来访问数据库。然而,在使用MyBatis连接MySQL8时,可能会出现一些问题。本文将介绍MyBatis连接MySQL8出现的...

    mysql limit两个参数.docx

    在MySQL数据库中,`LIMIT`子句是一个非常重要的部分,特别是在处理大数据集时,它允许我们有效地控制查询结果的返回数量。`LIMIT`通常与`OFFSET`一起使用,以实现分页效果,使得用户能够逐步浏览大量数据,而无需一...

    MySQL 用 limit 为什么会影响性能?.docx

    你真的会写一手好SQL吗?你真的深入了解数据库吗?你真的对MYSQL很理解吗?来自一线大厂资深数据库开发工程师的分享,纯粹干货,值得拥有。

    MySQL Interview Questions.pdf

    1. 什么是 MySQL? MySQL 是一个开源的关系数据库管理系统(RDBMS),它可以在 Web 和服务器上运行。 2. 使用 MySQL 的优点是什么? MySQL 快速、可靠、易于使用,且为开源软件。 3. 什么是数据库? 数据库是指...

    Mysql_limit.zip_limit

    在MySQL数据库系统中,`LIMIT`子句是一个非常重要的部分,它用于限制SQL查询返回的结果集数量。在处理大量数据时,`LIMIT`是优化查询性能、避免过度消耗资源的有效手段。下面我们将深入探讨`LIMIT`子句的工作原理,...

    详解mysql的limit经典用法及优化实例

    MySQL中的`LIMIT`子句是用于在查询结果集中限制返回行数的关键字,这对于实现分页功能至关重要。本文将深入探讨`LIMIT`的几种经典用法以及如何对其进行优化,特别是针对大数据量时性能的提升。 **用法一:指定开始...

    mysql limit分页优化详细介绍

    MySQL中的LIMIT子句是用于实现数据分页查询的关键部分,特别是在处理大量数据时。然而,随着数据量的增长,LIMIT的性能问题变得尤为突出。本文将深入探讨如何优化MySQL中的LIMIT分页查询,以提高数据库查询效率。 ...

    Mysql Limit 分页查询优化详解

    MySQL之Limit简单优化.md 同样是取90000条后100条记录,传统方式还是改造方式? 传统方式是先取了前90001条记录,取其中最大一个ID值作为起始标识,然后利用它可以快速定位下100条记录 改造方式是仅仅取90000条记录后

    mysql分页之limit优化技巧

    本文档针对mysql分页之limit慢的问题,使用联合索引在大数据量的情况下优化limit分页的性能

    mysql limit两个参数的四种用法

    MySQL中的`LIMIT`子句是查询结果集控制的关键部分,特别是在处理大数据量时,它能够有效地帮助我们获取所需的数据片段,而不是返回整个结果集。在MySQL中,`LIMIT`可以接受一个或两个参数,用于限制返回的记录数或...

    使用limit,offset分页场景时为什么会慢

    更糟糕的是,由于MySQL的存储引擎层与服务器层分离,`LIMIT`和`OFFSET`无法直接作用于数据,因此即使大部分数据会被丢弃,引擎层仍需处理这些额外的I/O操作。 为了提高效率,我们可以考虑以下解决方案: 1. **方案...

    毕业设计[整站程序]Wap Portal Server v1.21 (PHP+MYSQL的WAP整站)_wap.zip

    ]Wap Portal Server v1.21 (PHP+MYSQL?WAP??)_wap\`:这是整个项目的根目录,包含了所有文件和子目录。 2. `[????]Wap Portal Server v1.21 (PHP+MYSQL?WAP??)_wap\wap\`:这可能是网站的主程序目录,包含网站的前端...

    MySQL查询中LIMIT的大offset导致性能低下浅析

    在MySQL查询中,LIMIT子句通常用于实现分页功能,允许我们从结果集中获取特定数量的行。然而,当LIMIT的offset值非常大时,这可能导致显著的性能下降。这是因为MySQL在处理大offset时,必须首先扫描并忽略offset数量...

    mysql order by limit 的一个坑.docx

    MySQL Order By Limit 的一个坑 MySQL 是一种广泛使用的关系型数据库管理系统,它提供了强大的查询功能,其中 ORDER BY 和 LIMIT 两个关键字是最常用的查询语句。然而,在某些情况下,使用 ORDER BY 和 LIMIT 两个...

Global site tag (gtag.js) - Google Analytics