php循環次數越多效率越慢,循環次數越多反而不好為什麼

本文目錄一覽:

PHP循環代碼不斷獲取數據庫內容,導致數據讀取很慢,怎麼去修改下面的代碼讓數據讀取快點?(Thinkphp)

數據庫的讀取能一次查詢完成的盡量不要分成多次查詢

不知道你用的是什麼框架,如果有where_in方法的話可以用它來解決,先要構造出order_sn值的數組

沒有的話就自己構造’or’條件字符串,然後用where一次查詢完成

php php for循環查詢數據庫效率低,該如何優化mysql mysql

那就用sphinx 技術,目前這個是最好的,沒有之一。

下面是我百度百科弄過來的,怎麼使用還得你自己看白皮書了。

Sphinx的主要特性包括:

高速索引 (在新款CPU上,近10 MB/秒);

高速搜索 (2-4G的文本量中平均查詢速度不到0.1秒);

高可用性 (單CPU上最大可支持100 GB的文本,100M文檔);

提供良好的相關性排名

支持分布式搜索;

提供文檔摘要生成;

提供從MySQL內部的插件式存儲引擎上搜索

支持布爾,短語, 和近義詞查詢;

支持每個文檔多個全文檢索域(默認最大32個);

支持每個文檔多屬性;

支持斷詞;

支持單字節編碼與UTF-8編碼。[1]

where($map)->relation(true)->select();}’>請教thinkphp循環檢索速度慢,語句:for(…){$list=$model->where($map)->relation(true)->select();}

肯定會很慢,for循環一次那就讀取數據庫一次,循環上萬次你說數據庫能受得了不?最好一次去除數據,然後再對去除的數據操作

PHP程序寫得越多發現響應速度越慢,請問寫程序中應該注意些什麼?我是新手!怎麼提高程序響應時間!

舉個簡單的例子

循環一個數組時需要計算數組的長度.

通常,我們這麼寫

//$arr是一個數組;

for($i=0;$icount($arr);$i++){

/******這就是一個速度較慢的循環,因為每一次循環的時候都要運行count()計算數組長度*******/

}

//正確的寫法應該是

$count=count($arr);

for($i=0;$i$count;$i++){

/*****代碼*******/

}

//再舉個例子

echo ‘1’.’2′;慢;

echo ‘1’,’2′;快;

//還有帶引號”和雙引號””,單引號更快;

//數組的鍵位例如$arr[key]的寫法就不如$arr[‘key’]的快

/*同樣的,php在鏈接數據庫或者操作一些文件的時候;要做垃圾處理,在資源使用完畢時,要及時的關閉鏈接通道,清空結果集和占內存的變量;*/

/*還有很重要的一點,能在php程序里執行的任務,就不要跑到mysql里執行,好好的寫你的查詢語句*/

php foreach 嵌套循環大數組很慢?

雙層循環啊, 數量是 $gift * $fi的個數。 百萬級別的。

簡單的就是將excel中的數據導入的數據庫中(可以是另外一個表),將驗證碼字段建索引。然後再排查重複的,純sql就很快了。

php數據多影響返回速度嗎

框架用的是ci,數據庫是sqlsrv(sql server 2008),sql查詢返回的結果集有2萬條數據,我在ci框架裡面執行這個sql語句,網頁一直在轉圈,2萬條數據要轉30秒左右,但是我的sql語句在sql server 2008 R2 裡面執行 是秒查,在ci裡面用自帶查詢sql執行時間是200毫秒,,說明我的語句並不慢。個人覺得應該是返回數據太多導致慢的,返回的是2萬條數據,20個字段左右,,因為我做的是統計 ,要把數據導出成csv文件,所以數據比較多,這個該怎麼處理?

我的sql 語句是select * from table where create_time between ‘xxxx-xx-xx 00:00:00’ and ‘xxxx-xx-xx 23:59:59’; 是根據時間段來的 如果用戶選擇的時間範圍小 那數據就少 如果範圍大 那數據就大 數據大的時候就很慢

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();

}

這已經是最簡單的查詢了,sql語句秒查,但是用瀏覽器執行就很慢,

我在瀏覽器裡面執行 , 如果查詢結果幾萬條的話 瀏覽器就一直轉圈,要等四十多秒,500條足有數據是3、4秒

我在想是不是result_array()這一步 需要循環需要花費太多的時間,本身記錄就有幾萬條,然後還有二十個字段

==============2017-05-16 16:01更新===============

我沒有用ci框架自帶的result_array() ,查看ci框架文檔的時候看到一段話:

經常的,你會需要提供一個數據庫的 connection ID 或是一個 result ID, connection ID 可以這樣來

$this-db-conn_id;

result ID 可以從查詢返回的結果對象獲取,像這樣:

$query = $this-db-query(“SOME QUERY”);

$query-result_id;

於是我修改了我的代碼 拿 result_id 去循環讀取每條記錄

$sql =”select xxx”;

$query=$this-db-query($sql);

//這裡因為我用的是sqlsrv 所以使用的是sqlsrv_fetch_array 來循環讀取每一行

//然後每讀一行 就寫如csv文件

while($row=sqlsrv_fetch_array($query-result_id,SQLSRV_FETCH_ASSOC)){

//這裡是把row 寫入csv文件的代碼

}

具體的代碼就是下面了

$sql=”xxx”;

$query=$this-db-query($sql);

$filename= “CostDetail.csv”;//導出的文件名

header(‘Content-Type: application/vnd.ms-excel’);

header(‘Content-Disposition: attachment;filename=”‘.$filename.'”‘);

header(‘Cache-Control: max-age=0’);

// 打開PHP文件句柄,php://output 表示直接輸出到瀏覽器

$fp = fopen(‘php://output’, ‘a’);

// 輸出Excel列名信息

$head = array(xxx);

foreach ($head as $i = $v) {

// CSV的Excel支持GBK編碼,一定要轉換,否則亂碼

$head[$i] = iconv(‘utf-8’, ‘gbk’, $v);

}

// 將數據通過fputcsv寫到文件句柄

fputcsv($fp, $head);

// 計數器

$cnt = 0;

// 從數據庫中獲取數據,為了節省內存,不要把數據一次性讀到內存,從句柄中一行一行讀即可

$limit = 5000;

while ($row=sqlsrv_fetch_array($query-result_id,SQLSRV_FETCH_ASSOC)){

$cnt ++;

if ($limit == $cnt) { //刷新一下輸出buffer,防止由於數據過多造成問題

ob_flush();

flush();

$cnt = 0;

}

//這裡是把每個字段的編碼轉成gbk

$newRow[] = $this-_mb_convert_encoding($row[‘edis_orgsoid’]);

….

unset($row);

fputcsv($fp, $newRow);

unset($newRow);

}

exit;

這樣能導出文件 但是我看了一下 19204行的,16列 的csv文件 3M左右 , 需要40-45秒的時間才能導出好,,我想問這時間還能優化的再快點嗎

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/271730.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-16 19:23
下一篇 2024-12-16 19:23

相關推薦

發表回復

登錄後才能評論