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