1.當我們請求mysql服務器的時候,MySQL前端會有一個監(jiān)聽,請求到了之后,服務器得到相關的SQL語句,執(zhí)行之前(虛線部分為執(zhí)行),還會做權限的判斷
創(chuàng)新互聯(lián)主要從事網站設計制作、成都做網站、網頁設計、企業(yè)做網站、公司建網站等業(yè)務。立足成都服務甘泉,十多年網站建設經驗,價格優(yōu)惠、服務專業(yè),歡迎來電咨詢建站服務:028-86922220
2.通過權限之后,SQL就到MySQL內部,他會在查詢緩存中,看該SQL有沒有執(zhí)行過,如果有查詢過,則把緩存結果返回,說明在MySQL內部,也有一個查詢緩存.但是這個查詢緩存,默認是不開啟的,這個查詢緩存,和我們的Hibernate,Mybatis的查詢緩存是一樣的,因為查詢緩存要求SQL和參數(shù)都要一樣,所以這個命中率是非常低的(沒什么卵用的意思)。
3.如果我們沒有開啟查詢緩存,或者緩存中沒有找到對應的結果,那么就到了解析器,解析器主要對SQL語法進行解析
4.解析結束后就變成一顆解析樹,這個解析樹其實在Hibernate里面也是有的,大家回憶一下,在以前做過Hibernate項目的時候,是不是有個一個antlr.jar。這個就是專門做語法解析的工具.因為在Hibernate里面有HQL,它就是通過這個工具轉換成SQL的,我們編程語言之所以有很多規(guī)范、語法,其實就是為了便于這個解析器解析,這個學過編譯原理的應該知道.
5.得到解析樹之后,不能馬上執(zhí)行,這還需要對這棵樹進行預處理,也就是說,這棵樹,我沒有經過任何優(yōu)化的樹,預處理器會這這棵樹進行一些預處理,比如常量放在什么地方,如果有計算的東西,把計算的結果算出來等等...
6.預處理完畢之后,此時得到一棵比較規(guī)范的樹,這棵樹就是要拿去馬上做執(zhí)行的樹,比起之前的那棵樹,這棵得到了一些優(yōu)化
7.查詢優(yōu)化器,是MySQL里面最關鍵的東西,我們寫任何一條SQL,比如SELECT * FROM USER WHERE USERNAME = toby AND PASSWORD = 1,它會怎么去執(zhí)行?它是先執(zhí)行username = toby還是password = 1?每一條SQL的執(zhí)行順序查詢優(yōu)化器就是根據(jù)MySQL對數(shù)據(jù)統(tǒng)計表的一些信息,比如索引,比如表一共有多少數(shù)據(jù),MySQL都是有緩存起來的,在真正執(zhí)行SQL之前,他會根據(jù)自己的這些數(shù)據(jù),進行一個綜合的判定,判斷這一次在多種執(zhí)行方式里面,到底選哪一種執(zhí)行方式,可能運行的最快.這一步是MySQL性能中,最關鍵的核心點,也是我們的優(yōu)化原則.我們平時所講的優(yōu)化SQL,其實說白了,就是想讓查詢優(yōu)化器,按照我們的想法,幫我們選擇最優(yōu)的執(zhí)行方案,因為我們比MySQL更懂我們的數(shù)據(jù).MySQL看數(shù)據(jù),僅僅只是自己收集到的信息,這些信息可能是不準確的,MySQL根據(jù)這些信息選了一個它自認為最優(yōu)的方案,但是這個方案可能和我們想象的不一樣.
8.這里的查詢執(zhí)行計劃,也就是MySQL查詢中的執(zhí)行計劃,比如要先執(zhí)行username = toby還是password = 1
9.這個執(zhí)行計劃會傳給查詢執(zhí)行引擎,執(zhí)行引擎選擇存儲引擎來執(zhí)行這一份傳過來的計劃,到磁盤中的文件中去查詢,這個時候重點來了,影響這個查詢性能最根本的原因是什么?就是硬盤的機械運動,也就是我們平時熟悉的IO,所以一條查詢語句是快還是慢,就是根據(jù)這個時間的IO來確定的.那怎么執(zhí)行IO又是什么來確定的?就是傳過來的這一份執(zhí)行計劃.(優(yōu)化就是制定一個我們認為最快的執(zhí)行方案,最節(jié)省IO,和執(zhí)行最快)
10.如果開了查詢緩存,則返回結果給客戶端,并且查詢緩存也放一份。
php調用mysql存儲過程和函數(shù)的方法
存儲過程和函數(shù)是MySql5.0剛剛引入的。關于這方面的操作在PHP里面沒有直接的支持。但是由于Mysql PHP API的設計,使得我們可以在以前的PHP版本中的mysql php api中支持存儲過程和函數(shù)的調用。
在php中調用存儲過程和函數(shù)。
1。調用存儲過程的方法。
a。如果存儲過程有 IN/INOUT參數(shù),聲明一個變量,輸入?yún)?shù)給存儲過程,該變量是一對,
一個php變量(也可以不必,只是沒有php變量時,沒有辦法進行動態(tài)輸入),一個Mysql
變量。
b。如果存儲過程有OUT變量,聲明一個Mysql變量。
mysql變量的聲明比較特殊,必須讓mysql服務器知道此變量的存在,其實也就是執(zhí)行一條mysql語句。
入set @mysqlvar=$phpvar ;
c。使用mysql_query()/mysql_db_query()執(zhí)行mysql 變量聲明語句。
mysql_query("set @mysqlvar=$pbpvar");
這樣,在mysql服務器里面就有一個變量,@mysqlar。如果是IN參數(shù),那么其值可以由phpar傳入。
d。 如果是存儲過程。
1。執(zhí)行 call procedure()語句。
也就是mysql_query("call proceduer([var1]...)");
2. 如果有返回值,執(zhí)行select @ar,返回執(zhí)行結果。
mysql_query("select @var)"
接下來的操作就和php執(zhí)行一般的mysql語句一樣了。可以通過mydql_fetch_row()等函數(shù)獲得結果。
如果時函數(shù)。 直接執(zhí)行 select function() 就可以了。
$host="localhost";
$user="root";
$password="11212";
$db="samp_db";
$dblink=mysql_connect($host,$user,$password)
or die("can't connect to mysql");
mysql_select_db($db,$dblink)
or die("can't select samp_db");
$res=mysql_query("set @a=$password",$dblink);
$res=mysql_query("call aa(@a)",$dblink);
$res=mysql_query("select @a",$dblink);
$row=mysql_fetch_row($res);
echo $row[0];
navicat 怎樣調試mysql存儲過程
使用Navicat for MySQL工具創(chuàng)建存儲過程步驟:
1. 新建函數(shù)(選擇函數(shù)標簽 - 點擊新建函數(shù)):
2、輸入函數(shù)的參數(shù)個數(shù)、參數(shù)名、參數(shù)類型等:
3、編寫存儲過程:
4、保存(請輸入合法名稱):
5、運行存儲過程(在結果1,2,3...中可以查詢輸出信息):
本文標題:mysql存儲怎么調試 mysql如何調試存儲過程
當前路徑:http://jinyejixie.com/article42/dddhjec.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供網站導航、品牌網站制作、外貿建站、網站建設、電子商務、微信小程序
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)