了解MySQL(超詳細的MySQL工作原理 體系結構)
由圖,可以看出MySQL最上層是連接組件。下面服務器是由連接池、管理工具和服務、SQL接口、解析器、優化器、緩存、存儲引擎、文件系統組成。
—> 連接池:由于每次建立建立需要消耗很多時間,連接池的作用就是將這些連接緩存下來,下次可以直接用已經建立好的連接,提升服務器性能。
? —>SQL接口:接受用戶的SQL命令,并且返回用戶需要查詢的結果。比如select * from就是調用SQL Interface ? —>解析器: SQL命令傳遞到解析器的時候會被解析器驗證和解析。解析器是由Lex和YACC實現的,是一個很長的腳本。其功能是: a.將SQL語句分解成數據結構,并將這個結構傳遞到后續步驟,以后SQL語句的傳遞和處理就是基于這個結構的。 ? b.如果在分解構成中遇到錯誤,那么就說明這個sql語句是不合理的。 ? —>優化器:查詢優化器,SQL語句在查詢之前會使用查詢優化器對查詢進行優化。他使用的是“選取-投影-聯接”策略進行查詢。舉一個例子: select * from users where uname='admin'; 1.這個select查詢先根據where語句進行選取,而不是先將表全部查詢出來以后再進行uname過濾。(選取) ? 2.這個select查詢先根據*進行屬性投影,而不是將屬性全部取出以后再進行過濾。(投影) ? 3.將這兩個查詢條件聯接起來生成最終查詢結果。(聯接) ? —>緩存器: 查詢緩存,如果查詢緩存有命中的查詢結果,查詢語句就可以直接去查詢緩存中取數據。通過LRU算法將數據的冷端溢出,未來得及時刷新到磁盤的數據頁,叫臟頁。這個緩存機制是由一系列小緩存組成的。比如表緩存,記錄緩存,key緩存,權限緩存等 ? 簡而言之, 服務層執行過程:sql語句通過sql接口,服務器如果緩存cache有命中查詢結果,直接讀取數據。如果沒有命中查詢結果,由解析器進行sql語句的解析,預處理,經過優化器進行優化后提交給引擎層。通俗地說—>服務層告訴引擎層要做什么。
創建新表時如果不指定存儲引擎,那么系統就會使用默認存儲引擎,MySQL5.5 之前的 默認存儲引擎是 MyISAM,5.5 之后改為了 InnoDB。 MySQL 中同一個數據庫,不同的表格可以選擇不同的存儲引擎。
全局內存:緩沖池里面有數據緩存、索引緩存、鎖信息、插入緩存等等。此外還有重做日志緩存、額外的內存池。線程內存:Master Thread、IO Thread、Purage Thread、Page Cleaner Thread。 CheckPoint技術:緩沖池的設計目的為了協調CPU速度與磁盤速度的鴻溝。因此跟新或者刪除的時候直接操作的是內存的數據,先寫入重做日志,然后再修改內存池里面的數據,最后定時刷新到磁盤上。 四、MySQL文件結構
表空間可以在邏輯上管理多個數據文件,而這些數據文件又可以分布在不同磁盤中這就使得一個表的數據、索引等信息可以被記錄在多個磁盤中。 (1)共享表空間:共享表空間文件以.ibdata*來命名; 共享表空間下,innodb所有數據保存在一個單獨的表空間里面,而這個表空間可以由很多個文件組成,一個表可以跨多個文件存在,所以其大小限制不再是文件大小的限制,而是其自身的限制。從Innodb的官方文檔中可以看到,其表空間的最大限制為64TB,也就是說,Innodb的單表限制基本上也在64TB左右了,當然這個大小是包括這個表的所有索引等其他相關數據。共享表空間主要存放double write、undo log(undo log沒有獨立的表空間,需要存放在共享表空間) (2)獨立表空間:每個表擁有自己獨立的表空間用來存儲數據和索引。 (3)查看數據庫是否啟用獨立表空間:show variables like ‘innodb_file_per_table’;查看,innodb_file_per_table=ON,表示啟用了獨立表空間; (4)使用獨立表空間的優點:a.如果使用軟鏈接將大表分配到不同的分區上,易于管理數據文件b.易于監控解決IO資源使用的問題;c.易于修復和恢復損壞的數據;d.相互獨立的,不會影響其他innodb表;e.導出導入只針對單個表,而不是整個共享表空間;f.解決單個文件大小的限制;g.對于大量的delete操作,更易于回收磁盤空間;h.碎片較少,易于整理optimize table;i.易于安全審計;j.易于備份如果在innodb表已創建后設置innodb_file_per_table,那么數據將不會遷移到單獨的表空間上,而是續集使用之前的共享表空間。只有新創建的表才會分離到自己的表空間文件。 (5)共享表空間的數據文件配置:innodb_data_file_path參數:設置innoDB共享表空間數據文件的名字和大小,例如innodb_data_file_path=ibdata1:12M:autoextend(初始大小12M,不足自增)innodb_data_home_dir參數:innodb引擎的共享表空間數據文件的存放目錄目前主要是使用獨立表空間,但是共享表空間也是需要的,共享表空間主要存放double write、undo log等。 五、InnoDB表存儲結構表空間∶表空間可看做是InnoDB存儲引擎邏輯結構的最高層。 段 :表空間由各個段組成,常見的段有數據段、索引段、回滾段等。 區 :由64個連續的頁組成,每個頁大小為16kb,即每個區大小為1MB。頁:每頁16kb,且不能更改。常見的頁類型有∶數據頁、Undo頁、系統頁、事務數據頁、插入緩沖位圖頁、插入緩沖空閑列表頁、未壓縮的二進制大對象頁、壓縮的二進制大對象頁。 行 :InnoDB存儲引擎是面向行的(row-oriented),每頁最多允許存放7992行數據。 a.每頁=16Kb(頁類型:數據頁、undo頁、系統頁、事務數據頁、插入緩沖位圖頁、插入緩沖空閑列表頁、未壓縮的二進制大對象頁、壓縮的二進制大對象頁) b.區=64個連續的頁=64*16Kb=1MB |
|
來自: piyanat > 《Database》