PHP獲取MySQL執(zhí)行sql語(yǔ)句的查詢時(shí)間方法
如下所示:
//計(jì)時(shí)開(kāi)始
runtime();
//執(zhí)行查詢
mysql_query($sql);
//計(jì)時(shí)結(jié)束.
echo runtime(1);
//計(jì)時(shí)函數(shù)
function runtime($mode=0) {
static $t;
if(!$mode) {
$t = microtime();
return;
}
$t1 = microtime();
list($m0,$s0) = explode(" ",$t);
list($m1,$s1) = explode(" ",$t1);
return sprintf("%.3f ms",($s1+$m1-$s0-$m0)*1000);
}
對(duì)sql的執(zhí)行時(shí)間進(jìn)行分析可以:
1,確定sql的書(shū)寫(xiě)是否合理,高效
2,檢查字段、表的設(shè)計(jì)是否合理
方法1:在系統(tǒng)底層對(duì)sql操作類進(jìn)行改寫(xiě),通常類的結(jié)構(gòu)是
業(yè)務(wù)model ---》 db類 ---》 執(zhí)行sql
可以根據(jù)情況在某階段進(jìn)行改寫(xiě),比如db類;通常會(huì)修改
public function execute($sql) {
//code...
/*檢測(cè)sql執(zhí)行時(shí)間,超過(guò)執(zhí)行時(shí)間記錄到日志中*/
$start_time = array_sum(explode(' ', microtime()));
$this->lastresult = mysql_query($sql,$this->link) or $this->displayerror($sql);
$end_time = array_sum(explode(' ', microtime()));
$differ = $end_time - $start_time;
if($differ >0.001){ //修改時(shí)間范圍,單位:秒
putContent('sqlLOG', date('Y-m-d H:i:s', $start_time)." "
. date('Y-m-d H:i:s', $end_time)." "
.$differ. " ".$sql."\r\n");
}
//code...
}
引用:
phpmyadmin中的代碼,獲得query執(zhí)行時(shí)間如下:
// garvin: Measure query time.
// TODO-Item http://sourceforge.net/tracker/index.php?func=detail&aid=571934&group_id=23067&atid=377411
$querytime_before = array_sum(explode(' ', microtime()));
$result = @PMA_DBI_try_query($full_sql_query, null, PMA_DBI_QUERY_STORE);
$querytime_after = array_sum(explode(' ', microtime()));
$GLOBALS['querytime'] = $querytime_after - $querytime_before;
除了這種方式還可以使用mysql的profile。
這個(gè)更適合統(tǒng)計(jì)多條sql的執(zhí)行情況。
我見(jiàn)過(guò)好像是一個(gè)博客,訪問(wèn)頁(yè)面之后會(huì)有一個(gè)提示大概說(shuō)共查詢了幾次數(shù)據(jù)庫(kù),用了多長(zhǎng)時(shí)間查詢數(shù)據(jù),那么開(kāi)啟mysql的profile就可以輕松實(shí)現(xiàn)了。
批注1:micortime函數(shù)
計(jì)算微秒的函數(shù)micortime(),可以返回當(dāng)前UNIX時(shí)間戳和微秒數(shù)。返回浮點(diǎn)數(shù)單位為秒。不過(guò)函數(shù)僅在支持gettimeofday()系統(tǒng)調(diào)用的操作系統(tǒng)下可用??梢圆橄率謨?cè)詳細(xì)了解下??赡芤l(fā)有些不明的錯(cuò)誤,注意。
批注2:profile最多保存100條記錄,這個(gè)要怎么解決呢?
profiling_history_size The number of statements for which to maintain profiling information if profiling is enabled. The default value is 15. The maximum value is 100. Setting the value to 0 effectively disables profiling.
這個(gè)最大就100條了,改不了。
引用2:PHP獲取毫秒級(jí)時(shí)間戳的方法
java里面可以通過(guò)gettime();獲取。如果是要與java寫(xiě)的某些程序進(jìn)行高精度的毫秒級(jí)的對(duì)接通信,則需要使用PHP輸出毫秒級(jí)的時(shí)間。為獲取更為精準(zhǔn)的毫秒級(jí)時(shí)間戳可以使用下面的代碼:
<?php
function getMillisecond() {
list($t1, $t2) = explode(' ', microtime());
return (float)sprintf('%.0f',(floatval($t1)+floatval($t2))*1000);
}
echo getMillisecond();
運(yùn)行結(jié)果:1.46647658229E+12
以上這篇PHP獲取MySQL執(zhí)行sql語(yǔ)句的查詢時(shí)間方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解析在zend Farmework下如何創(chuàng)立一個(gè)FORM表單
本篇文章是對(duì)在zend Farmework下如何創(chuàng)立一個(gè)FORM表單的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06
php實(shí)現(xiàn)仿寫(xiě)CodeIgniter的購(gòu)物車類
這篇文章主要介紹了php實(shí)現(xiàn)仿寫(xiě)CodeIgniter的購(gòu)物車類,較為詳細(xì)的分析了購(gòu)物車的功能與具體實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07
php靜態(tài)編譯swoole-cli并調(diào)用rust的動(dòng)態(tài)鏈接庫(kù)
這篇文章主要為大家介紹了靜態(tài)編譯swoole-cli并調(diào)用rust的動(dòng)態(tài)鏈接庫(kù)實(shí)現(xiàn)步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
PHP性能優(yōu)化 產(chǎn)生高度優(yōu)化代碼
PHP是一種在服務(wù)器端執(zhí)行的腳本語(yǔ)言,它開(kāi)發(fā)了世界上許多知名的網(wǎng)站,包括雅虎和Facebook等。下面介紹6條PHP代碼、性能優(yōu)化的技巧。2011-07-07
PHP實(shí)現(xiàn)通過(guò)URL提取根域名
本文給大家分享的是個(gè)人在做項(xiàng)目的時(shí)候遇到的,需要通過(guò)php實(shí)現(xiàn)從URL中提取根域名的代碼以及實(shí)現(xiàn)思路,有需要的小伙伴可以參考下2016-03-03
PHP更新購(gòu)物車數(shù)量(表單部分/PHP處理部分)
購(gòu)物車的數(shù)量是根據(jù)用戶的選擇商品加入而不斷增加的,下面是具體的實(shí)現(xiàn)代碼(客服端部分/PHP服務(wù)器端處理),有類似需求的朋友可以參考下2013-05-05
PHP 通過(guò)Socket收發(fā)十六進(jìn)制數(shù)據(jù)的實(shí)現(xiàn)代碼
以下是對(duì)PHP中通過(guò)Socket收發(fā)十六進(jìn)制數(shù)據(jù)的實(shí)現(xiàn)代碼進(jìn)行了分析介紹。需要的朋友可以過(guò)來(lái)參考下2013-08-08

