1. 程式人生 > 程式設計 >PHP匯出資料超時的優化建議

PHP匯出資料超時的優化建議

一般情況下,匯出超時可能都是以下三種情況:
  一、sql語句複雜,查詢時間過長;
  二、處理查詢後資料邏輯冗餘;
  三、資料量過大導致響應超時。
接下來分別給出這三種情況的優化建議。

一、sql語句複雜,查詢時間過長

  1、檢視索引是否設定妥當,即所用的查詢條件是否有新增索引,當然索引不是越多越好,只需給常用的查詢條件加上即可,一般採用B+樹的索引方式(具體原因可自行百度,不再贅述)
  2、在查詢語句中儘量避免IN、NOT IN、IS NULL、OR、!=、<>、LIKE、OR、NOT EXISTS這些查詢條件的出現,會導致索引失效。
- IN查詢時,可以考慮用BETWEEN來代替

- LIKE查詢時,僅當"%"在前時會索引www.cppcns.com失效,"%"在後是不會失效的
- 查詢條件裡還要避免數字的出現,使用字串,數字也會導致索引失效,例如,查詢:"pid"=1,可以優化為"pid"="1"
- 要儘量避免在迴圈中使用查詢語句,這種情況一般可http://www.cppcns.com以用join或者with來解決(當涉及到跨庫時,請謹慎使用這種方式!)
- 查詢時,可以指定需要查詢的欄位,排除掉不需要的欄位避免資源浪費
- 當資料量多大時,可以使用分頁和快取來優化(具體方法請參考資料量過大導致響應超時部分)
溫馨提示:在執行查詢語句後,可以通過show profiles
來查詢語句的資源消耗情況來幫助你更好的優化sql語句;關於查詢語句是否使用了索引,可以在查詢語句前加explain來檢視索引使用情況,例如:
explain select * from user whereIYTrgq id= '1';

二、處理查詢後資料邏輯冗餘

- 在做陣列迴圈時,儘量使用continue、break來減少沒必要的迴圈;

- 儘量減少if巢狀層數,在需要用到多個if-else時,使用switch可以提高效率,特別是在資料量大時
- 當進行陣列賦值時,
  一次賦一個值,使用$arr[]=1,會比array_push($arr,"1"),更快,
  但是當需要多次賦值時,
    arhttp://www.cppcns.com
ray_push($arr,"1","2","3",...),會比 $arr[]="1"; $arr[]="2" $arr[]="3" ... 更快 - 遍歷陣列進行賦值時,儘量使用引用的方式,減少記憶體開銷,例如: foreach($arr as &$item){ $item = 1; ... }

三、資料量過大導致響應超時

當數量兩過大,又不想用非同步的方式匯出excel檔案時,可以嘗試使用csv來作為到處格式,且查詢匯出資料時可以使用分頁的方式查詢,匯出時利用ob_flush進行快取。例如:

$page = 1;    // 頁面
$pageSize = 1000;    //每頁條數
while(
  $list = Db::name("user")->page($page)->limit($pageSize)->select()
)
{
  foreach($list as &$item){
    // TODO 進行相應的邏輯處理
  }
  $page++;
}

當資料訪問次數過多時,建議使用redis快取一些固定資料,減少查詢次數。
當然,最好的方式還是使用非同步的方式匯出,建議使用或者go語言搭建微服務來進行匯出。

到此這篇關於匯出資料超時的優化的文章就介紹到這了,更多相關PHP匯出資料超時內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!