PHP導(dǎo)出數(shù)據(jù)超時的優(yōu)化建議
一般情況下,導(dǎo)出超時可能都是以下三種情況:
一、sql語句復(fù)雜,查詢時間過長;
二、處理查詢后數(shù)據(jù)邏輯冗余;
三、數(shù)據(jù)量過大導(dǎo)致響應(yīng)超時。
接下來分別給出這三種情況的優(yōu)化建議。
一、sql語句復(fù)雜,查詢時間過長
1、查看索引是否設(shè)置妥當(dāng),即所用的查詢條件是否有添加索引,當(dāng)然索引不是越多越好,只需給常用的查詢條件加上即可,一般采用B+樹的索引方式(具體原因可自行百度,不再贅述)
2、在查詢語句中盡量避免IN、NOT IN、IS NULL、OR、!=、<>、LIKE、OR、NOT EXISTS這些查詢條件的出現(xiàn),會導(dǎo)致索引失效。
- IN查詢時,可以考慮用BETWEEN來代替
- LIKE查詢時,僅當(dāng)"%"在前時會索引失效,"%"在后是不會失效的
- 查詢條件里還要避免數(shù)字的出現(xiàn),使用字符串,數(shù)字也會導(dǎo)致索引失效,例如,查詢:"pid"=1,可以優(yōu)化為"pid"="1"
- 要盡量避免在循環(huán)中使用查詢語句,這種情況一般可以用join或者with來解決(當(dāng)涉及到跨庫時,請謹(jǐn)慎使用這種方式?。?br />
- 查詢時,可以指定需要查詢的字段,排除掉不需要的字段避免資源浪費
- 當(dāng)數(shù)據(jù)量多大時,可以使用分頁和緩存來優(yōu)化(具體方法請參考數(shù)據(jù)量過大導(dǎo)致響應(yīng)超時部分)
溫馨提示:在執(zhí)行查詢語句后,可以通過show profiles
來查詢語句的資源消耗情況來幫助你更好的優(yōu)化sql語句;關(guān)于查詢語句是否使用了索引,可以在查詢語句前加explain
來查看索引使用情況,例如:
explain select * from user where id= '1';
二、處理查詢后數(shù)據(jù)邏輯冗余
- 在做數(shù)組循環(huán)時,盡量使用continue、break來減少沒必要的循環(huán); - 盡量減少if嵌套層數(shù),在需要用到多個if-else時,使用switch可以提高效率,特別是在數(shù)據(jù)量大時 - 當(dāng)進(jìn)行數(shù)組賦值時, 一次賦一個值,使用$arr[]=1,會比array_push($arr,"1"),更快, 但是當(dāng)需要多次賦值時, array_push($arr,"1","2","3",...),會比 $arr[]="1"; $arr[]="2" $arr[]="3" ... 更快 - 遍歷數(shù)組進(jìn)行賦值時,盡量使用引用的方式,減少內(nèi)存開銷,例如: foreach($arr as &$item){ $item = 1; ... }
三、數(shù)據(jù)量過大導(dǎo)致響應(yīng)超時
當(dāng)數(shù)量兩過大,又不想用異步的方式導(dǎo)出excel文件時,可以嘗試使用csv來作為到處格式,且查詢導(dǎo)出數(shù)據(jù)時可以使用分頁的方式查詢,導(dǎo)出時利用ob_flush進(jìn)行緩存。例如:
$page = 1; // 頁面 $pageSize = 1000; //每頁條數(shù) while( $list = Db::name("user")->page($page)->limit($pageSize)->select() ) { foreach($list as &$item){ // TODO 進(jìn)行相應(yīng)的邏輯處理 } $page++; }
當(dāng)數(shù)據(jù)訪問次數(shù)過多時,建議使用redis緩存一些固定數(shù)據(jù),減少mysql查詢次數(shù)。
當(dāng)然,最好的方式還是使用異步的方式導(dǎo)出,建議使用python或者go語言搭建微服務(wù)來進(jìn)行導(dǎo)出。
到此這篇關(guān)于PHP導(dǎo)出數(shù)據(jù)超時的優(yōu)化的文章就介紹到這了,更多相關(guān)PHP導(dǎo)出數(shù)據(jù)超時內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 使用PHPExcel實現(xiàn)數(shù)據(jù)批量導(dǎo)出為excel表格的方法(必看)
- 利用PHPExcel讀取Excel的數(shù)據(jù)和導(dǎo)出數(shù)據(jù)到Excel
- 完美解決php 導(dǎo)出excle的.csv格式的數(shù)據(jù)時亂碼問題
- 詳解thinkphp實現(xiàn)excel數(shù)據(jù)的導(dǎo)入導(dǎo)出(附完整案例)
- PHP使用PHPexcel導(dǎo)入導(dǎo)出數(shù)據(jù)的方法
- jquery+php實現(xiàn)導(dǎo)出datatables插件數(shù)據(jù)到excel的方法
相關(guān)文章
PHP和MYSQL實現(xiàn)分頁導(dǎo)航思路詳解
這篇文章主要介紹了PHP和MYSQL實現(xiàn)分頁導(dǎo)航思路詳解,非常不錯,具有參考借鑒價值,需要的朋友可以參考下2017-04-04PHPStorm 2020.1 調(diào)試 Nodejs的多種方法詳解
這篇文章主要介紹了PHPSTORM 2020.1 調(diào)試 Nodejs的多種方法詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09PHP實現(xiàn)Redis單據(jù)鎖以及防止并發(fā)重復(fù)寫入
本篇文章給大家分享了PHP實現(xiàn)Redis單據(jù)鎖以及如何防止并發(fā)重復(fù)寫入的方法,對此有需要的朋友參考學(xué)習(xí)下。2018-04-04PHP開發(fā)框架kohana3 自定義路由設(shè)置示例
這篇文章主要介紹了PHP開發(fā)框架kohana3 自定義路由設(shè)置示例,kohana是一個純PHP5的開發(fā)框架,需要的朋友可以參考下2014-07-07PHP中關(guān)于php.ini參數(shù)優(yōu)化詳解
在本篇文章里小編給大家整理的是關(guān)于PHP引擎php.ini參數(shù)優(yōu)化的相關(guān)知識點,有興趣的朋友們可以學(xué)習(xí)下。2020-02-02