导出数据优化技巧

因为在公司业务需要,经常会有导数据的情况,有的时候需要查询统计的信息比较多,需要查询多个表去取值,有时候可能跨库到sqlserver中,sqlserver中不同的城市对应不同的库,加上数据量比较大,如果不采取合适的方案会对服务器负载影响很大,加上大家都是那个服务器上做操作,很容易使服务器崩溃。

所以总结了网上的一些优化技巧,使之符合公司业务需求。当然要配合sql优化。

加了进度条和脚本运行时间统计,使导数据过程更加有乐趣。

废话不多说,贴部分代码供大家参考:

<?php
set_time_limit(0);   //设置进行完程序才结束, 不因时间过长中断ini_set(‘memory_limit‘, ‘-1‘);  //设置脚本可以使用的内存大小为php配置的最大内存$start_time = microtime(true); //脚本运行开始时间,~秒
$fp = fopen("57city.csv", ‘a+‘);$header_data = ["大区","城市","楼盘名称","楼盘ID","物业类型","销售状态","楼盘级别","完善状态","楼盘封闭标识","已建楼栋数","封闭楼栋数"];fputcsv($fp, $header_data);
$Db= new DbRDHandle(‘proj_table‘);$citys = [‘合肥‘,‘南昌‘,‘南宁‘,‘宁波‘,‘无锡‘,‘西安‘,‘佛山‘,‘珠海‘,‘扬州‘,‘兰州‘,‘南通‘,‘厦门‘,‘徐州‘,‘昆明‘,‘惠州‘,‘昆山‘,‘北海‘,‘汕头‘,‘三亚‘,‘中山‘,‘江门‘,‘柳州‘,‘镇江‘,‘桂林‘,‘上海‘,‘长沙‘,‘常州‘,‘东莞‘,‘福州‘,‘贵阳‘,‘海南‘,‘深圳‘,‘重庆‘,‘成都‘,‘杭州‘,‘武汉‘,‘苏州‘,‘南京‘,‘广州‘];
//按城市连接sqlserver库(连库时间会很长,所以采取尽量少连接策略)foreach ($citys as $item => $city){
  $sql = "............";  $res = $Db->Query($sql,MYSQL_ASSOC);  $count = $res[0][‘num‘] ? $res[0][‘num‘] : 0;  $num = 0;   //计数器  //每隔$limit行,刷新一下输出buffer,不要太大也不要太小  $limit = 100000
  $slavedbinfo = getslavedbinfo($city);  $SqlServerRDHandle = new SqlServerRDHandle($slavedbinfo,‘proj_sql_server‘);  //分页查询,每取1000条数据sleep 1秒  for ($i = 0; $i < $count; $i += 1000) {      $j = $i + 1000;      $sql = "SELECT City,operastion,Saling,house_level,ProjName,Newcode FROM proj_table WHERE City=$city AND N_or_E=‘N‘ AND operastion in (‘1‘,‘2‘,‘3‘,‘4‘) AND is_approve=‘Y‘ AND Saling in (‘1‘,‘2‘) limit $i,$j";      $res = $Db->Query($sql,MYSQL_ASSOC);      if (is_array($res) && count($res) > 0) {          $count = count($res);          foreach ($res as $key => $val) {              $num++;              //刷新一下输出buffer,防止由于数据过多造成问题              if ($limit == $num) {                  ob_flush();                  flush();                  $num = 0;              }              $sql1 = "SELECT level FROM field_~~~ WHERE newcode=‘".$val[‘Newcode‘]."‘";              $level_info = $Db->Query($sql1,MYSQL_ASSOC);              $res[$key][‘level‘] = $level_info[0][‘level‘] ? $level_info[0][‘level‘] : ‘‘;              unset($level_info);

              $sql2 = "SELECT belong FROM cities WHERE city_name=‘".$val[‘City‘]."‘";              $belong_info = $Db->Query($sql2,MYSQL_ASSOC);              $res[$key][‘belong‘] = $belong_info[0][‘belong‘] ? $belong_info[0][‘belong‘] : ‘‘;              unset($belong_info);                           $sql3 = "SELECT sealIden FROM proj_~~~ WHERE newcode=‘".$val[‘Newcode‘]."‘";        $sealIden_info = $Db->Query($sql3,MYSQL_ASSOC);        $res[$key][‘sealIden‘] = $sealIden_info[0][‘sealIden‘] ? $sealIden_info[0][‘sealIden‘] : ‘‘;        unset($sealIden_info);

        $sql4 = "SELECT count(id) AS build FROM proj_~~~ with(nolock) WHERE newcode=‘".$v[‘Newcode‘]."‘";        $res4 = $SqlServerRDHandle->Query($sql4,‘MSSQL_ASSOC‘);        $res[$key][‘build‘] = $res4[0][‘build‘] !== false ? $res4[0][‘build‘] : ‘‘;        unset($res4);

        $sql5 = "SELECT count(id) AS sealIdenNum FROM  proj_~~~ with(nolock) WHERE sealIden=‘Y‘ AND newcode=‘".$v[‘Newcode‘]."‘";        $res5 = $SqlServerRDHandle->Query($sql5,‘MSSQL_ASSOC‘);        $res[$key][‘sealIdenNum‘] = $res5[0][‘sealIdenNum‘] !== false ? $res5[0][‘sealIdenNum‘] : ‘‘;        unset($res5);
        $row = [];        $row[] = $res[$key][‘belong‘];        $row[] = $res[$key][‘City‘];        $row[] = $res[$key][‘ProjName‘];        $row[] = $res[$key][‘Newcode‘]."\t";        $row[] = $operastion[$res[$key][‘operastion‘]];        $row[] = $saling[$res[$key][‘Saling‘]];        $row[] = $res[$key][‘house_level‘];        $row[] = $level[$res[$key][‘level‘]];        $row[] = $sealIden[$res[$key][‘sealIden‘]];        $row[] = $res[$key][‘build‘];        $row[] = $res[$key][‘sealIdenNum‘];        fputcsv($fp, $row);

        unset($row);        unset($res[$key]);        //数据导出百分比       $percent = intval((($key+1) / $count) * 100);       //隐藏光标,显示进度条       printf("\033[?25lmprogress: \033[41m\033[1m %d%% %s\r\033[0m", $percent, str_repeat(‘ ‘, $percent));      }    }  }  sleep(1);}
fclose($fp);
echo "\n";if ($start_time != ‘‘) {    //输出运行时间    echo "runtime: ";    $time_diff = microtime(true) - $start_time;    $runtime = secToTime($time_diff);    echo $runtime . "\n";}echo "Done.\n";printf("\033[?25h");    //显示光标
/** * @param $time * @return bool|string */function secToTime($time){    if (is_numeric($time)) {        $value = [‘days‘=>0, ‘hours‘=>0, ‘minutes‘=>0, ‘seconds‘=>0];        if ($time >= 86400) {            $value[‘days‘] = floor($time / 86400);            $time = $time % 86400;        }        if ($time >= 3600) {            $value[‘hours‘] = floor($time / 3600);            $time = $time % 3600;        }        if ($time >= 60) {            $value[‘minutes‘] = floor($time / 60);            $time = $time % 60;        }        $value[‘seconds‘] = round($time, 3);        $runtime = $value[‘days‘] . ‘天‘ . $value[‘hours‘] . ‘小时‘ . $value[‘minutes‘] . ‘分‘ . $value[‘seconds‘] . ‘秒‘;        return $runtime;    } else {        return false;    }}
 

 

 
时间: 2024-08-15 06:05:34

导出数据优化技巧的相关文章

使用Exp和Expdp导出数据的性能对比与优化

1.前言 数据备份对信息系统的安全运行至关重要,我们的用户中,使用RMan或第三方专业备份软件的越来越多,但是很多用户仍然保留了传统的Exp作为备份策略的一部分,主要是由于这种备份方式简单易用,而且恢复到其他机器上也很方便,所以,虽然有其他的备份方式,但是Exp方式仍然会同时使用,甚至还有不少的用户只有这种备份方式. 随着用户的数据量增长,Exp导出方式存在的问题也日渐突出,主要就是耗时长,有的甚至超过3个小时,加上常见的后台自动作业:汇总表的计算,自动费用的计算,统计信息的收集等工作,使一个晚

Java性能优化技巧及实战

Java性能优化技巧及实战 关于Java代码的性能优化,是每个javaer都渴望掌握的本领,进而晋升为大牛的必经之路,但是对java的调优需要了解整个java的运行机制及底层调用细节,需要多看多读多写多试,并非一朝一夕之功.本文是近期笔者给公司员工内部做的一个培训,主要讲述在系统压测过程中出现的性能问题,以及如何在编码过程中提升代码的运行效率,需要掌握哪些实战技巧.片子里干货较多,也很具有实操性,因此发文出来,共享给大家(部分数据做了去除公司特征信息,见谅).(PS:由于原文是ppt,因此做了导

【转】101个MySQL调试和优化技巧

MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些思路是通用的.我已经把他们分成几类,来帮助你掌握更多MySQL的调节和优化技巧. MySQL 服务器硬件和操作系统调节: 1. 拥有足够的物理内存来把整个InnoDB文件加载到内存中——在内存中访问文件时的速度要比在硬盘中访问时快的多. 2. 不惜一切代价避免使用Swap交换分区 – 交换时是从硬盘读

【转载:Mysql 优化】101个mysql优化技巧

MySQL是一个功能强大的开源数据库. 随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限. 这里是101条调节和优化MySQL安装的技巧. 一些技巧是针对特定的安装环境的,但这些思路是通用的. 我已经把他们分成几类,来帮助你掌握更多MySQL的调节和优化技巧. MySQL 服务器硬件和操作系统调节: 1. 拥有足够的物理内存来把整个InnoDB文件加载到内存中--在内存中访问文件时的速度要比在硬盘中访问时快的多. 2. 不惜一切代价避免使用Swap交换分区 – 交换时是

101个MySQL的调节和优化技巧

MySQL是一个功能强大的开源数据库.随着越来越多的数据库驱动的应用程序,人们一直在推动MySQL发展到它的极限.这里是101条调节和优化MySQL安装的技巧.一些技巧是针对特定的安装环境的,但这些思路是通用的.我已经把他们分成几类,来帮助你掌握更多MySQL的调节和优化技巧. MySQL 服务器硬件和操作系统调节: 1. 拥有足够的物理内存来把整个InnoDB文件加载到内存中——在内存中访问文件时的速度要比在硬盘中访问时快的多. 2. 不惜一切代价避免使用Swap交换分区 – 交换时是从硬盘读

JavaScript 性能优化技巧分享

JavaScript 作为当前最为常见的直译式脚本语言,已经广泛应用于 Web 应用开发中.为了提高Web应用的性能,从 JavaScript 的性能优化方向入手,会是一个很好的选择. 本文从加载.上下文.解析.编译.执行和捆绑等多个方面来讲解 JavaScript 的性能优化技巧,以便让更多的前端开发人员掌握这方面知识. 什么是高性能的 JavaScript 代码? 尽管目前没有高性能代码的绝对定义,但却存在一个以用户为中心的性能模型,可以用作参考:RAIL模型. 响应 如果你的应用程序能在1

读薄《高性能MySql》(二)Schem与数据优化

读薄<高性能MySql>(一)MySql基本知识 读薄<高性能MySql>(二)Schem与数据优化 选择更优的数据类型 当我们设计数据类型的时候应该选择最优的数据类型,因为好的数据类型会使数据库性能提升很多,特别是在使用 ORM 的时候要尤其消息,因为需求的复杂性,ORM 基本上没什么可能会生成最优的类型. 接下来介绍一些通用的数据类型结构. 更小的通常更好 一般情况下,应该尽量使用存储数据最小的数据单类型 尽量使用自带的数据类型 比如保存日期最好用 mysql 内有的日期类型而

SQL优化技巧

我们开发的大部分软件,其基本业务流程都是:采集数据→将数据存储到数据库中→根据业务需求查询相应数据→对数据进行处理→传给前台展示.对整个流程进行分析,可以发现软件大部分的操作时间消耗都花在了数据库相关的IO操作上.所以对我们的SQL语句进行优化,可以提高软件的响应性能,带来更好的用户体验. 在开始介绍SQL优化技巧之前,先推介一款数据库管理神器Navicat,官网:https://www.navicat.com.cn/whatisnavicat Navicat是一套快速.可靠和全面的数据库管理工

友链依旧重要:移动互联网背后的SEO优化技巧

移动互联网发展这么快,将来还需要网站吗成为很多站长的疑问,那做SEO优化的站长不是将走向失业,实际上,在2010年中国移动互联网开始至今,移动化SEO不仅没有让这个市场失去活力,反而在各种场景下依旧有站长通过移动化SEO优化获得不错的收入. 以前我们常说SEO优化主要为站内优化和站外优化,站内主要做各种设置如301.404.内链.内容与用户体验,站外优化则是友情链接,其中外链成为最重要的工作之一,随着技术的进步以及搜索引擎针对页面的评分变化,友链开始发生极大的改变,但是这种兼具着SEO优化以及品