PHP導出數據超時的優化建議
一般情況下,導出超時可能都是以下三種情況:
一、sql語句復雜,查詢時間過長;
二、處理查詢後數據邏輯冗餘;
三、數據量過大導致響應超時。
接下來分別給出這三種情況的優化建議。
一、sql語句復雜,查詢時間過長
1、查看索引是否設置妥當,即所用的查詢條件是否有添加索引,當然索引不是越多越好,隻需給常用的查詢條件加上即可,一般采用B+樹的索引方式(具體原因可自行百度,不再贅述)
2、在查詢語句中盡量避免IN、NOT IN、IS NULL、OR、!=、<>、LIKE、OR、NOT EXISTS這些查詢條件的出現,會導致索引失效。
– IN查詢時,可以考慮用BETWEEN來代替
– LIKE查詢時,僅當”%”在前時會索引失效,”%”在後是不會失效的
– 查詢條件裡還要避免數字的出現,使用字符串,數字也會導致索引失效,例如,查詢:”pid”=1,可以優化為”pid”=”1″
– 要盡量避免在循環中使用查詢語句,這種情況一般可以用join或者with來解決(當涉及到跨庫時,請謹慎使用這種方式!)
– 查詢時,可以指定需要查詢的字段,排除掉不需要的字段避免資源浪費
– 當數據量多大時,可以使用分頁和緩存來優化(具體方法請參考數據量過大導致響應超時部分)
溫馨提示:在執行查詢語句後,可以通過show profiles
來查詢語句的資源消耗情況來幫助你更好的優化sql語句;關於查詢語句是否使用瞭索引,可以在查詢語句前加explain
來查看索引使用情況,例如:
explain select * from user where id= '1';
二、處理查詢後數據邏輯冗餘
- 在做數組循環時,盡量使用continue、break來減少沒必要的循環; - 盡量減少if嵌套層數,在需要用到多個if-else時,使用switch可以提高效率,特別是在數據量大時 - 當進行數組賦值時, 一次賦一個值,使用$arr[]=1,會比array_push($arr,"1"),更快, 但是當需要多次賦值時, array_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緩存一些固定數據,減少mysql查詢次數。
當然,最好的方式還是使用異步的方式導出,建議使用python或者go語言搭建微服務來進行導出。
到此這篇關於PHP導出數據超時的優化的文章就介紹到這瞭,更多相關PHP導出數據超時內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!