亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

深入理解:Mysql執行SQL語句過程

發布時間:2020-08-11 17:48:12 來源:ITPUB博客 閱讀:209 作者:Java大蝸牛 欄目:編程語言

深入理解:Mysql執行SQL語句過程

 

開發人員基本都知道,我們的數據存在數據庫中(目前最多的是mysql和oracle,由于作者更擅長mysql,所以這里默認數據庫為mysql),服務器通過sql語句將查詢數據的請求傳入到mysql數據庫。數據庫拿到sql語句以后。都是進行了哪些操作呢?這里向大家介紹下我的個人的理解,歡迎大家評論區批評指正。

流程概述

mysql得到sql語句后,大概流程如下:

1.sql的解析器:負責解析和轉發sql

2.預處理器:對解析后的sql樹進行驗證

3.查詢優化器:得到一個執行計劃

4.查詢執行引擎:得到數據結果集

5.將數據放回給調用端。

流程圖如下所示:

深入理解:Mysql執行SQL語句過程

 

分發器及緩存階段

首先,如果系統的緩存功能開啟著的話,sql語句進入mysql后,sql進行判斷,是否為select關鍵字。如果是,那么先去查詢緩存中進行查詢,如果在查詢緩存中可以命中sql語句,那么直接返回查詢緩存中的查詢語句對應的value值(在緩存中,把查詢語句做一個hash運算,結果作為key值,查詢的結果集為value)。

如果命中緩存的話,查詢速度是相當快的。但是查詢緩存也有它相應的缺點。

首先,開啟緩存的話,服務器會消耗大量的內存空間;其次,緩存有的時候并不適用;最后,有的情況下,開啟緩存也不會將對應的sql語句寫入緩存。

緩存不適用的情況:

緩存的鎖的力度比較大,而且對于動態sql的支持度不夠。

緩存在數據進行更新的時候,是進行的表級鎖,更新結束后,會把所有與更新內容相關的緩存全部刪除。所以,如果表的寫入比較多的話,緩存是比較浪費性能的。如果寫入特別多,可能緩存反而會導致mysql變慢。

查詢不到緩存的情況:

1.查詢條件有不確定數據:如now ,current_time等。

2.緩存對大小寫敏感,如select * from test 和SELECT* FROM test 就不會解析為同一條sql

查詢帶來的額外開銷:

1.開始前需要先檢查緩存是否命中。

2.結果輸出的時候,需要額外進行數據的緩存操作。

3.寫入數據時,mysql會將對應表的所有緩存都設置為失效。當緩存內存較大的時候,會導致系統消耗較大。

sql的解析器與預處理

sql解析器是在命令分發之后,將對應的sql語句,解析為sql解析樹。sql解析樹是Mysql本身內部的語法規則和解析查詢。驗證是否使用錯誤的關鍵字,sql語法順序是否正確等。(語法層面的錯誤)

解析完成后,進行查詢語句預處理器,根據mysql的規則,檢查解析樹是否合法。(表格是否存在,別名是否有歧義等)

查詢優化器

查詢優化器獲取到執行計劃然后由查詢執行引擎執行相應的操作。查詢優化器,是數據庫l的一個核心模塊,分為cbo和rbo兩種。

其中,rbo是基于規則的優化器。(rbo在oracle早期版本中使用,現在也保留,不過默認為cbo。mysql沒有rbo優化器)

這些規則是硬編碼在數據庫的代碼中的。rbo會根據輸入的sql語句可以匹配到的優先級最高的規則去作為執行計劃。例如:在rbo中有這么一條規則:有索引的情況下,使用索引。那么所有的帶有索引的表在執行的時候,都會走索引。rbo最大的問題在于,通過固定規則來決定執行計劃。并不會考慮sql中涉及的對象的數量和分布。有可能選出來的規則不是最優的執行計劃。

cbo 是基于成本的優化器(基于統計信息),從目標諸多的執行路徑中選擇一個成本最小的執行路徑來作為執行計劃。成本指的是mysql根據相關的統計信息,算出來sql語句對應的io,cpu等的消耗的一個估計值。計算過程涉及到索引、表、行等數據,過程比較復雜。

1.查詢優化器使用統計信息為sql選擇執行計劃。

2.mysql沒有數據直方圖,也無法手工刪除統計信息。(oracle有)

3.在服務器曾有查詢優化器,卻沒有保存數據和索引統計信息。統計信息由存儲引擎實現,不同的存儲引擎會存儲不同的統計信息。

4.統計信息分為索引的統計信息和表的統計信息。

查看統計信息

索引統計信息

show index from table 或information_schema.statistics表

表統計信息

show table status like 或 information_schema.tables表

查詢執行引擎+返回數據給客戶端

得到執行計劃后,根據已有的執行計劃,查詢執行引擎,mysql的SQL Layer層,調用Storage Engine Layer層的接口,從mysql的存儲引擎中獲取到相對應的結果集,然后返回給用戶。

執行完成后,將結果返回給客戶端,如果是查詢語句,并且開啟了緩存,那么,mysql會同時將結果集放到查詢緩存中。然后將查到的結果集返回。如果是增刪改操作,那么返回執行語句后受影響的行數。

順便給大家推薦一個Java架構方面的交流學習群: 698581634 ,里面會分享一些資深架構師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高并發、高性能、分布式、微服務架構的原理,JVM性能優化這些成為架構師必備的知識體系,主要針對Java開發人員提升自己,突破瓶頸,相信你來學習,會有提升和收獲。在這個群里會有你需要的內容  朋友們請抓緊時間加入進來吧。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

和林格尔县| 泸溪县| 万源市| 禹城市| 越西县| 普兰县| 博罗县| 浙江省| 晋中市| 万盛区| 卫辉市| 桦甸市| 米脂县| 汪清县| 普定县| 哈尔滨市| 乐至县| 土默特右旗| 江川县| 新巴尔虎右旗| 大厂| 翼城县| 晋江市| 南平市| 太康县| 湛江市| 台山市| 邓州市| 咸宁市| 五河县| 安新县| 保德县| 石景山区| 界首市| 忻州市| 环江| 宜君县| 荣昌县| 将乐县| 墨竹工卡县| 云浮市|