框架用的是ci,數(shù)據(jù)庫(kù)是sqlsrv(sql server 2008),sql查詢返回的結(jié)果集有2萬(wàn)條數(shù)據(jù),我在ci框架里面執(zhí)行這個(gè)sql語(yǔ)句,網(wǎng)頁(yè)一直在轉(zhuǎn)圈,2萬(wàn)條數(shù)據(jù)要轉(zhuǎn)30秒左右,但是我的sql語(yǔ)句在sql server 2008 R2 里面執(zhí)行 是秒查,在ci里面用自帶查詢sql執(zhí)行時(shí)間是200毫秒,,說(shuō)明我的語(yǔ)句并不慢。個(gè)人覺(jué)得應(yīng)該是返回?cái)?shù)據(jù)太多導(dǎo)致慢的,返回的是2萬(wàn)條數(shù)據(jù),20個(gè)字段左右,,因?yàn)槲易龅氖墙y(tǒng)計(jì) ,要把數(shù)據(jù)導(dǎo)出成csv文件,所以數(shù)據(jù)比較多,這個(gè)該怎么處理?
為海曙等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及海曙網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、海曙網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
我的sql 語(yǔ)句是select * from table where create_time between 'xxxx-xx-xx 00:00:00' and 'xxxx-xx-xx 23:59:59'; 是根據(jù)時(shí)間段來(lái)的 如果用戶選擇的時(shí)間范圍小 那數(shù)據(jù)就少 如果范圍大 那數(shù)據(jù)就大 數(shù)據(jù)大的時(shí)候就很慢
public function aa(){
$sql ="select * from table where create_time between 'xxxx-xx-xx 00:00:00' and 'xxxx-xx-xx 23:59:59'";
$result=$this-db-query($sql)-result_array();
}
這已經(jīng)是最簡(jiǎn)單的查詢了,sql語(yǔ)句秒查,但是用瀏覽器執(zhí)行就很慢,
我在瀏覽器里面執(zhí)行 , 如果查詢結(jié)果幾萬(wàn)條的話 瀏覽器就一直轉(zhuǎn)圈,要等四十多秒,500條足有數(shù)據(jù)是3、4秒
我在想是不是result_array()這一步 需要循環(huán)需要花費(fèi)太多的時(shí)間,本身記錄就有幾萬(wàn)條,然后還有二十個(gè)字段
==============2017-05-16 16:01更新===============
我沒(méi)有用ci框架自帶的result_array() ,查看ci框架文檔的時(shí)候看到一段話:
經(jīng)常的,你會(huì)需要提供一個(gè)數(shù)據(jù)庫(kù)的 connection ID 或是一個(gè) result ID, connection ID 可以這樣來(lái)
$this-db-conn_id;
result ID 可以從查詢返回的結(jié)果對(duì)象獲取,像這樣:
$query = $this-db-query("SOME QUERY");
$query-result_id;
于是我修改了我的代碼 拿 result_id 去循環(huán)讀取每條記錄
$sql ="select xxx";
$query=$this-db-query($sql);
//這里因?yàn)槲矣玫氖莝qlsrv 所以使用的是sqlsrv_fetch_array 來(lái)循環(huán)讀取每一行
//然后每讀一行 就寫(xiě)如csv文件
while($row=sqlsrv_fetch_array($query-result_id,SQLSRV_FETCH_ASSOC)){
//這里是把row 寫(xiě)入csv文件的代碼
}
具體的代碼就是下面了
$sql="xxx";
$query=$this-db-query($sql);
$filename= "CostDetail.csv";//導(dǎo)出的文件名
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment;filename="'.$filename.'"');
header('Cache-Control: max-age=0');
// 打開(kāi)PHP文件句柄,php://output 表示直接輸出到瀏覽器
$fp = fopen('php://output', 'a');
// 輸出Excel列名信息
$head = array(xxx);
foreach ($head as $i = $v) {
// CSV的Excel支持GBK編碼,一定要轉(zhuǎn)換,否則亂碼
$head[$i] = iconv('utf-8', 'gbk', $v);
}
// 將數(shù)據(jù)通過(guò)fputcsv寫(xiě)到文件句柄
fputcsv($fp, $head);
// 計(jì)數(shù)器
$cnt = 0;
// 從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù),為了節(jié)省內(nèi)存,不要把數(shù)據(jù)一次性讀到內(nèi)存,從句柄中一行一行讀即可
$limit = 5000;
while ($row=sqlsrv_fetch_array($query-result_id,SQLSRV_FETCH_ASSOC)){
$cnt ++;
if ($limit == $cnt) { //刷新一下輸出buffer,防止由于數(shù)據(jù)過(guò)多造成問(wèn)題
ob_flush();
flush();
$cnt = 0;
}
//這里是把每個(gè)字段的編碼轉(zhuǎn)成gbk
$newRow[] = $this-_mb_convert_encoding($row['edis_orgsoid']);
....
unset($row);
fputcsv($fp, $newRow);
unset($newRow);
}
exit;
這樣能導(dǎo)出文件 但是我看了一下 19204行的,16列 的csv文件 3M左右 , 需要40-45秒的時(shí)間才能導(dǎo)出好,,我想問(wèn)這時(shí)間還能優(yōu)化的再快點(diǎn)嗎
mediawikiphp導(dǎo)入很慢的原因是返回?cái)?shù)據(jù)太多。根據(jù)查詢相關(guān)資料信息顯示:MediaWiki是一款基于PHP+MySQL環(huán)境的開(kāi)源Wiki系統(tǒng),可以導(dǎo)入及導(dǎo)出文件,如果返回?cái)?shù)據(jù)太多,會(huì)造成mediawikiphp導(dǎo)入很慢。
其實(shí)這根據(jù)框架來(lái)說(shuō)的,有些框架,加載就要100ms,有些則是在幾十毫秒。針對(duì)不同業(yè)務(wù)來(lái)說(shuō),接口響應(yīng)速度,也不盡相同,業(yè)務(wù)很重的接口100ms還是可以接受的,當(dāng)然能優(yōu)化最好,一般接口,速度在幾十毫秒應(yīng)該是可以的