注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

早衰男的巢

大音希声 道隐无名

 
 
 

日志

 
 

MySQL: 高效offset  

2014-04-04 17:53:00|  分类: others note. |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
对一个log表进行梳理,条目已经达到千万级,太占空间查起来也很慢。
没有用直接在库内dump而是写了个脚本分小批量小批量地过滤和导入到另一个新表。

每次筛查200条记录,循环地 
$pageSize = 200;
$offset=0;
while(...){
$sql = "select .. from tab_log ... order by id desc limit {$offset},{$pageSize};";
$rs = mysql_query($sql); 
......
$offset+=$pageSize;
}

当 $offset 去到 80万的时候,这个查询已经慢得让人无法忍受,每次需要2分钟(119s)。
虽然机器性能也是一个原因,为了解决这个问题找到了一个很赞的方法。

$pageSize = 200;
//$offset=0;
$minId = 99999999;//根据库的最大ID写的,这里我随意写了个数..
while(...){
//$sql = "select .. from tab_log ... order by id desc limit {$offset},{$pageSize};";
$sql = "select `id` .. from tab_log ... where id < {$minId} order by id desc limit {$pageSize};"; //用索引id值来代替offset
//以下灰色这块只是本来【....】的一些业务逻辑 下文只是利用的$arrData来取得这一批记录里id最小值
$rs = mysql_query($sql); 
unset($arrData);
While($r = mysql_fetch_array($rs)){
$arrData[] = $r;
}
......
$minid = $arrData[count($arrData)-1]["id"]; //记录上一次取出的最小的id值
//$offset+=$pageSize; //已经不需要offset了
}

查询的效率立刻飚到0.02s,赞!

  评论这张
 
阅读(3483)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018