sql語句通過client對(duì)接MYSQL的連接層,然后有查詢緩存,語法解析器,優(yōu)化器,生成最終執(zhí)行計(jì)劃,然后去查詢插件式存儲(chǔ)引擎,如InnoDB等,其數(shù)據(jù)是通過存儲(chǔ)引擎來和物理設(shè)備交互的。
成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括婁煩網(wǎng)站建設(shè)、婁煩網(wǎng)站制作、婁煩網(wǎng)頁制作以及婁煩網(wǎng)絡(luò)營(yíng)銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢(shì)、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,婁煩網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到婁煩省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
如果查詢緩存沒有命中,那么SQL請(qǐng)求會(huì)進(jìn)入分析器,分析器是用來分辨SQL語句的執(zhí)行目的,其執(zhí)行過程大致分為兩步:
表1 語法分析關(guān)鍵字然后再通過語法規(guī)則解析,判斷輸入的SQL 語句是否滿足MySQL語法,并且生成圖5的語法樹。由SQL語句生成的四個(gè)單詞中,識(shí)別出兩個(gè)關(guān)鍵字,分別是select 和from。根據(jù)MySQL的語法Select 和 from之間對(duì)應(yīng)的是fields 字段,下面應(yīng)該掛接username;在from后面跟隨的是Tables字段,其下掛接的是userinfo。
優(yōu)化器的作用是對(duì)SQL進(jìn)行優(yōu)化,生成最有的執(zhí)行方案。如圖6所示,前面提到的SQL解析器通過語法分析和語法規(guī)則生成了SQL語法樹。這個(gè)語法樹作為優(yōu)化器的輸入,而優(yōu)化器(黃色的部分)包含了邏輯變換和代價(jià)優(yōu)化兩部分的內(nèi)容。在優(yōu)化完成以后會(huì)生成SQL執(zhí)行計(jì)劃作為整個(gè)優(yōu)化過程的輸出,交給執(zhí)行器在存儲(chǔ)引擎上執(zhí)行。
所處的位置如上圖所示,這節(jié)的重點(diǎn)在優(yōu)化器中的邏輯變換和代價(jià)優(yōu)化上。
邏輯變換也就是在關(guān)系代數(shù)基礎(chǔ)上進(jìn)行變換,其目的是為了化簡(jiǎn),同時(shí)保證SQL變化前后的結(jié)果一致,也就是邏輯變化并不會(huì)帶來結(jié)果集的變化。其主要包括以下幾個(gè)方面:
這樣講概念或許有些抽象,通過圖7 來看看邏輯變化如何在SQL中執(zhí)行的吧。
如圖7所示,從上往下共有4個(gè)步驟:
1. 針對(duì)存在的SQL語句,首先通過“否定消除”,去掉條件判斷中的“NOT”。語句由原來的“or”轉(zhuǎn)換成“and”,并且大于小于符號(hào)進(jìn)行變號(hào)。藍(lán)色部分為修改前的SQL,紅色是修改以后的SQL。2. 等值傳遞,這一步很好理解分別降”t2.a=9” 和”t2.b=5”分別替換掉SQL中對(duì)應(yīng)的值。3. 接下來就是常量表達(dá)式計(jì)算,將“5+7”計(jì)算得到“12”。4. 最后是常量表達(dá)式計(jì)算后的化簡(jiǎn),將”9=10”化簡(jiǎn)為”true”帶入到最終的SQL表達(dá)式中完成優(yōu)化。
代價(jià)優(yōu)化是用來確定每個(gè)表,根據(jù)條件是否應(yīng)用索引,應(yīng)用哪個(gè)索引和確定多表連接的順序等問題。為了完成代價(jià)優(yōu)化,需要找到一個(gè)代價(jià)最小的方案。因此,優(yōu)化器是通過基于代價(jià)的計(jì)算方法來決定如何執(zhí)行查詢的(Cost-based Optimization)。簡(jiǎn)化的過程如下:
這里將配置操作的代價(jià)分為MySQL 服務(wù)層和MySQL 引擎層,MySQL 服務(wù)層主要是定義CPU的代價(jià),而MySQL 引擎層主要定義IO代價(jià)。MySQL 5.7 引入了兩個(gè)系統(tǒng)表mysql.server_cost和mysql.engine_cost來分別配置這兩個(gè)層的代價(jià)。如下:MySQL 服務(wù)層代價(jià)保存在表server_cost中,其具體內(nèi)容如下:
由上可以看出創(chuàng)建臨時(shí)表的代價(jià)是很高的,尤其是內(nèi)部的myisam或innodb臨時(shí)表。MySQL 引擎層代價(jià)保存在表engine_cost中,其具體內(nèi)容如下:
目前io_block_read_cost和memory_block_read_cost默認(rèn)值均為1,實(shí)際生產(chǎn)中建議酌情調(diào)大memory_block_read_cost,特別是對(duì)普通硬盤的場(chǎng)景。MySQL會(huì)根據(jù)SQL查詢生成的查詢計(jì)劃中對(duì)應(yīng)的操作從上面兩張代價(jià)表中查找對(duì)應(yīng)的代價(jià)值,并且進(jìn)行累加形成最終執(zhí)行SQL計(jì)劃的代價(jià)。再將多種可能的執(zhí)行計(jì)劃進(jìn)行比較,選取最小代價(jià)的計(jì)劃執(zhí)行。
當(dāng)分析器生成查詢計(jì)劃,并且經(jīng)過優(yōu)化器以后,就到了執(zhí)行器。執(zhí)行器會(huì)選擇執(zhí)行計(jì)劃開始執(zhí)行,但在執(zhí)行之前會(huì)校驗(yàn)請(qǐng)求用戶是否擁有查詢的權(quán)限,如果沒有權(quán)限,就會(huì)返回錯(cuò)誤信息,否則將會(huì)去調(diào)用MySQL引擎層的接口,執(zhí)行對(duì)應(yīng)的SQL語句并且返回結(jié)果。例如SQL:“SELECT * FROM userinfo WHERE username = 'Tom';“假設(shè) “username“ 字段沒有設(shè)置索引,就會(huì)調(diào)用存儲(chǔ)引擎從第一條開始查,如果碰到了用戶名字是” Tom“, 就將結(jié)果集返回,沒有查找到就查看下一行,重復(fù)上一步的操作,直到讀完整個(gè)表或者找到對(duì)應(yīng)的記錄。需要注意SQL語句的執(zhí)行順序并不是按照書寫順序來的,順序的定義會(huì)在分析器中做好,一般是按照如下順序:
如果命中的記錄比較多,應(yīng)用會(huì)從MySql Server一批批獲取數(shù)據(jù)
本文從MySQL中SQL語句的執(zhí)行過程作為切入點(diǎn),首先介紹了查詢請(qǐng)求的執(zhí)行流程,其中將MySQL的處理分為MySQL Server層和MySQL存儲(chǔ)引擎層。通過介紹SQL語句的流轉(zhuǎn),引出了后面要介紹的5大組件,他們分別是:連接器、查詢緩存、分析器、優(yōu)化器、執(zhí)行器。后面的內(nèi)容中對(duì)每個(gè)組件進(jìn)行了詳細(xì)的介紹。連接器,負(fù)責(zé)身份認(rèn)證和權(quán)限鑒別;查詢緩存,將查詢的結(jié)果集進(jìn)行緩存,提高查詢效率;分析器,對(duì)SQL語句執(zhí)行語法分析和語法規(guī)則,生成語法樹和執(zhí)行計(jì)劃;優(yōu)化器,包括邏輯變換和代價(jià)優(yōu)化;執(zhí)行器,在檢查用戶權(quán)限以后對(duì)數(shù)據(jù)進(jìn)行逐條查詢,整個(gè)過程遵守SQL語句的執(zhí)行順序。
1.一條查詢語句如何執(zhí)行?
2.一條更新語句如何執(zhí)行?
3.innodb的redolog是什么?
4.什么是寫緩沖
5.寫緩沖一定好嗎?
6.什么情況會(huì)引發(fā)刷臟頁
關(guān)于一條mysql查詢語句在mysql中的執(zhí)行流程
如select name from test where id=10;
1.連接器---先與mysql服務(wù)端連接器建立連接,若查詢緩存命中則直接返回 (查詢緩存的弊端:查詢緩存的失效非常頻繁,只要有對(duì)一個(gè)表的更新,這個(gè)表上所有的查詢緩存都會(huì)被清空。)
2.分析器---詞法分析告訴服務(wù)端你要干什么(我要找 test表中id為10的名字) ( 其中sql語法錯(cuò)誤在這塊暴露 )
3.優(yōu)化器---服務(wù)端會(huì)思考該怎么執(zhí)行最優(yōu)(索引的選擇)
4.執(zhí)行器---檢查用戶對(duì)庫對(duì)表的權(quán)限
5.存儲(chǔ)引擎--存儲(chǔ)數(shù)據(jù),提供讀寫接口
以u(píng)pdate a set name=1 where id=1;
主要區(qū)別在于在查詢到數(shù)據(jù)之后(select name from a where id=1),如果是innodb引擎它會(huì)進(jìn)行日志的兩階段提交:
1.開啟事務(wù),寫入redolog(innodb引擎特有),并更新內(nèi)存
3.寫入binlog,提交事務(wù),commit
我們知道m(xù)ysql數(shù)據(jù)存儲(chǔ)包含內(nèi)存與磁盤兩個(gè)部分,innodb是按數(shù)據(jù)頁(通常為16k)從磁盤讀取到內(nèi)存中的(剩余操作在內(nèi)存中執(zhí)行),當(dāng)要更新數(shù)據(jù)時(shí),若目標(biāo)數(shù)據(jù)的數(shù)據(jù)頁剛好在內(nèi)存中,則直接更新。不在呢?
將這個(gè)更新操作(也可能是插入) 緩存在change buffer中 (redolog也會(huì)記錄這個(gè)change buffer操作)等到下一次查詢要用到這些數(shù)據(jù)時(shí),再執(zhí)行這些操作,改變數(shù)據(jù)(稱為合并操作記錄稱為merge)。
innodb_change_buffer_max_size
innodb_change_buffering
先介紹兩個(gè)概念
因?yàn)閞edolog是環(huán)形日志,當(dāng)redolog寫滿時(shí),就需要“擦掉”開頭的一部分?jǐn)?shù)據(jù)來達(dá)到循環(huán)寫,這里的擦掉指,指將redolog日志的checkpoint位置從 CP推進(jìn)到CP‘ ,同時(shí)將兩點(diǎn)之間的臟頁刷到磁盤上(flush操作),此時(shí)系統(tǒng)要停止所有的更新操作(防止更新操作丟失)
1.系統(tǒng)內(nèi)存不足。當(dāng)要讀取新的內(nèi)存頁時(shí)就要淘汰一些數(shù)據(jù)頁,如果淘汰的正好是臟頁,就要執(zhí)行一次flush操作
2.Mysql認(rèn)為系統(tǒng)處于“空閑狀態(tài)”
3.正常關(guān)閉Mysql
上述后兩者場(chǎng)景(系統(tǒng)空閑和正常關(guān)閉)對(duì)于性能都沒太大影響。
當(dāng)為第一種redolog寫滿時(shí),系統(tǒng)無法執(zhí)行更新操作,所有操作都會(huì)堵塞
當(dāng)為第二種內(nèi)存不夠用時(shí),如果淘汰臟頁太多,影響mysql響應(yīng)時(shí)間
后兩者刷臟頁會(huì)影響性能,所以Mysql需要有刷臟頁控制策略,可以從以下幾個(gè)設(shè)置項(xiàng)考慮
1.設(shè)置innodb_io_capacity告訴innodb所在主機(jī)的IO能力
在我們?nèi)粘I钪信紶枙?huì)遇到一些自己不知道如何解決的問題,比如使用安裝好的mysql。那么我們應(yīng)該怎樣解決這種自己不知道如何使用安裝好的mysql的情況呢?那么接下來就由我來介紹一下使用安裝好的mysql的步驟吧。
本次操作以Dell電腦為例,具體操作步驟如下:
第一步:
首先,打開MySQLWorkbench,雙擊打開即可。打開后的界面如下所示,然后選擇數(shù)據(jù)庫實(shí)例,雙擊進(jìn)行登錄。圖中數(shù)據(jù)庫的實(shí)例是LocalinstanceMYSQL57
第二步:
然后,輸入用戶名和密碼進(jìn)行登錄。如下圖所示:
第三步:
登錄成功后,界面如下所示。其中,區(qū)域1顯示的是數(shù)據(jù)庫服務(wù)器中已經(jīng)創(chuàng)建的數(shù)據(jù)庫列表。區(qū)域2是關(guān)于數(shù)據(jù)庫的操作列表。區(qū)域三是sql的編輯器和執(zhí)行環(huán)境,區(qū)域4是執(zhí)行結(jié)果的列表
第四步:
在sql的編輯器中輸入測(cè)試語句,如圖所示,其中world數(shù)據(jù)庫是mysql自帶的測(cè)試數(shù)據(jù)庫,然后選擇執(zhí)行(或者使用快捷鍵ctrl+enter)。執(zhí)行成功后,查詢結(jié)果會(huì)顯示在下面的列表中。
第五步:
使用完畢后,直接退出,并且如果無需數(shù)據(jù)庫的后繼操作的話,記得關(guān)掉MySQL的服務(wù)
看了我的方法,現(xiàn)在你學(xué)會(huì)如何使用安裝好的mysql了嗎?學(xué)會(huì)了的話就快快把這個(gè)方法分享出去,讓更多的人知道如何使用安裝好的mysql。以上就是使用安裝好的mysql的步驟。
本文章基于Dell品牌、Windows10系統(tǒng)撰寫的。
當(dāng)前文章:mysql怎么執(zhí)行,mysql的執(zhí)行流程
轉(zhuǎn)載注明:http://jinyejixie.com/article26/dsdgdcg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、Google、自適應(yīng)網(wǎng)站、微信公眾號(hào)、服務(wù)器托管、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)