mysql 架构名_MySQL 逻辑体系架构
【邏輯架構】
第一層:所包含的服務并不是MySQL所獨有的技術。它們都是服務于C/S程序或者是這些程序所需要的 :連接處理,身份驗證,安全性等等。
第二層:通常叫做 SQL Layer。在 MySQL數據庫系統處理底層數據之前的所有工作都是在這一層完成的,包括權限判斷, sql解析,行計劃優化, query cache 的處理以及所有內置的函數(如日期,時間,數學運算,加密)等等。各個存儲引擎提供的功能都集中在這一層,如存儲過程,觸發器,視圖等
第三層:通常叫做StorEngine Layer ,也就是底層數據存取操作實現部分,由多種存儲引擎共同組成。它們負責存儲和獲取所有存儲在MySQL中的數據。就像Linux眾多的文件系統 一樣。每個存儲引擎都有自己的優點和缺陷。服務器是通過存儲引擎API來與它們交互的。這個接口隱藏了各個存儲引擎不同的地方。對于查詢層盡可能的透明。這個API包含了很多底層的操作。如開始一個事務,或者取出有特定主鍵的行。存儲引擎不能解析SQL,互相之間也不能通信。僅僅是簡單的響應服務器的請求。
【查詢過程】
1.客戶端請求:
MySQL客戶端/服務端通信協議是“半雙工”的:在任一時刻,要么是服務器向客戶端發送數據,要么是客戶端向服務器發送數據,這兩個動作不能同時發生。因而在實際開發中,盡量保持查詢簡單且只返回必需的數據,減小通信間數據包的大小和數量
2.查詢緩存:
在解析一個查詢語句前,如果緩存是打開的,那么MySQL會檢查這個查詢語句是否命中查詢緩存中的數據。如果當前查詢恰好命中查詢緩存,在檢查一次用戶權限后直接返回緩存中的結果。這種情況下,查詢不會被解析,也不會生成執行計劃,更不會執行。
MySQL將緩存存放在一個引用表(不要理解成table,可以認為是類似于HashMap的數據結構),通過一個哈希值索引,這個哈希值通過查詢本身、當前要查詢的數據庫、客戶端協議版本號等一些可能影響結果的信息計算得來。所以兩個查詢在任何字符上的不同(例如:空格、注釋),都會導致緩存不會命中。
如果查詢中包含任何用戶自定義函數、存儲函數、用戶變量、臨時表、mysql庫中的系統表,其查詢結果都不會被緩存。比如函數NOW()
MySQL的查詢緩存系統會跟蹤查詢中涉及的每個表,如果這些表(數據或結構)發生變化,那么和這張表相關的所有緩存數據都將失效。正因為如此,在任何的寫操作時,MySQL必須將對應表的所有緩存都設置為失效。如果查詢緩存非常大或者碎片很多,這個操作就可能帶來很大的系統消耗,甚至導致系統僵死一會兒。而且查詢緩存對系統的額外消耗也不僅僅在寫操作,讀操作也不例外
3.語法解析和預處理:
MySQL通過關鍵字將SQL語句進行解析,并生成一顆對應的解析樹。這個過程解析器主要通過語法規則來驗證和解析。比如SQL中是否使用了錯誤的關鍵字或者關鍵字的順序是否正確等等。預處理則會根據MySQL規則進一步檢查解析樹是否合法。比如檢查要查詢的數據表和數據列是否存在等等
4.查詢優化
經過前面的步驟生成的語法樹被認為是合法的了,并且由優化器將其轉化成查詢計劃。多數情況下,一條查詢可以有很多種執行方式,最后都返回相應的結果。優化器的作用就是找到這其中最好的執行計劃。MySQL使用基于成本的優化器,它嘗試預測一個查詢使用某種執行計劃時的成本,并選擇其中成本最小的一個。
5.查詢執行引擎
在完成解析和優化階段以后,MySQL會生成對應的執行計劃,查詢執行引擎根據執行計劃給出的指令逐步執行得出結果。整個執行過程的大部分操作均是通過調用存儲引擎實現的接口來完成,這些接口被稱為handler API。查詢過程中的每一張表由一個handler實例表示。實際上,MySQL在查詢優化階段就為每一張表創建了一個handler實例,優化器可以根據這些實例的接口來獲取表的相關信息,包括表的所有列名、索引統計信息等。存儲引擎接口提供了非常豐富的功能,但其底層僅有幾十個接口,這些接口像搭積木一樣完成了一次查詢的大部分操作。
6.返回結果
查詢執行的最后一個階段就是將結果返回給客戶端。即使查詢不到數據,MySQL仍然會返回這個查詢的相關信息,比如該查詢影響到的行數以及執行時間等等。
【存儲引擎】
查看現在提供的存儲引擎: show engines;
查看現在默認使用的存儲引擎:show variables like '%storage_engine%';
查看某表使用的存儲引擎:show create table 表名;
InnoDB和MyISAM的區別:
InnoDB 支持事務,MyISAM 不支持事務。這是 MySQL 將默認存儲引擎從 MyISAM 變成 InnoDB 的重要原因之一;
InnoDB 支持外鍵,而 MyISAM 不支持。對一個包含外鍵的 InnoDB 表轉為 MYISAM 會失敗;
InnoDB 是聚簇索引,MyISAM 是非聚簇索引。聚簇索引的文件存放在主鍵索引的葉子節點上,因此 InnoDB 必須要有主鍵,通過主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然后再通過主鍵查詢到數據。因此,主鍵不應該過大,因為主鍵太大,其他索引也都會很大。而 MyISAM 是非聚集索引,數據和索引是分離的,索引保存的是數據文件的指針。主鍵索引和輔助索引是獨立的。
InnoDB 不保存表的具體行數,執行select count(*) from table 時需要全表掃描。而 MyISAM 用一個變量保存了整個表的行數,執行上述語句時只需要讀出該變量即可,速度很快;
InnoDB 最小的鎖粒度是行鎖,MyISAM 最小的鎖粒度是表鎖。一個更新語句會鎖住整張表,導致其他查詢和更新都會被阻塞,因此并發訪問受限。這也是 MySQL 將默認存儲引擎從 MyISAM 變成 InnoDB 的重要原因之一;
總結
以上是生活随笔為你收集整理的mysql 架构名_MySQL 逻辑体系架构的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 360浏览器怎么才能加速访问网站的速度
- 下一篇: 凸格充电宝是牌子的吗