MySQL深入學習(1)——體系結構與存儲引擎簡介

1. 體系結構

     1. 首先簡單的瞭解一下什麼是數據庫系統:數據庫管理系統由一個互相關聯的數據的集合和一組用以訪問這些數據的程序組成。這個數據集合通常稱爲數據庫。

    在數據庫系統出現之前,是使用的文件系統,其存在非常大的弊端:

(1)數據的冗餘和不一致:文件通常由不同人創建、維護,相同信息可能存在多個文件,冗餘的信息佔用了存儲空間,並且當部分數據進行修改時可能因某些文件未同時修改而導致數據不一致。
(2)數據訪問困難:文件一般以一定規律排布信息,數據的訪問只能依賴於該規律,當出現新需求時,又需要重新編排。                      (3)數據孤立:數據分散在不同文件中,並且文件格式可能不同。
(4)完整性問題:
(5)原子性問題:典型的銀行轉賬問題。
(6)併發訪問異常:文件處理系統無法應對高併發訪問。
(7)安全性問題:並非文件系統的所有用戶都可以訪問所有數據。

    而數據庫系統則是通過一個管理系統程序來維護管理這些數據文件,所有的客戶端或者說用戶,都必須通過該管理系統進行讀寫操作數據文件,該管理系統程序需主要負責

  • 存儲管理:邏輯關係與物理存儲的映射
  •  緩存機制:優化執行效率
  •  SQL解析:提供外部可操作的語言解析
  •  日誌管理:記錄操作、運行信息,並提供恢復依據
  •   權限劃分:多用戶管理
  •   容災機制:災難應對及恢復機制
  •   索引管理:優化查找效率
  •   鎖管理:應對併發

    對於MySQL數據庫來說,其詳細架構圖如下

   由上圖可以看到, MySQL數據庫主要有以下幾部分組成:

(1)連接池組件:對,該組件和在Java中所使用的的數據庫連接池概念相同,由於每次建立建立需要消耗很多時間,連接池的作用就是將這些連接緩存下來,下次可以直接用已經建立好的連接,提升服務器性能。

(2)管理服務和工具組件:系統管理和控制工具,例如備份恢復、Mysql複製、集羣等。

(3)SQL接口組件:接受處理從連接中接收到的用戶的SQL命令,並且返回用戶需要查詢的結果。比如select from就是調用SQL Interface

(4)查詢分析器組件:在調用SQL接口組件執行SQL命令前,首先要進行解析命令,判斷該SQL命令是否合法,SQL命令傳遞到解析器的時候會被解析器驗證和解析。解析器是由Lex和YACC實現的,是一個很長的腳本, 主要功能:
a . 將SQL語句分解成數據結構,並將這個結構傳遞到後續步驟,以後SQL語句的傳遞和處理就是基於這個結構的
b. 如果在分解構成中遇到錯誤,那麼就說明這個sql語句是不合理的,此時就會通過數據庫連接來告知客戶端該SQL語句的錯誤信息,同事還會返回一個對應的錯誤碼。

(5)優化器組件:SQL語句解析完畢後,只要沒有錯誤,那麼就會進行SQL語句優化,在進行查詢之前,會對查詢語句進行一定的優化,使用的是“選取-投影-聯接”策略進行查詢。
用一個例子就可以理解: select uid,name from user where gender = 1;
這個select 查詢先根據where 語句進行選取,而不是先將表全部查詢出來以後再進行gender過濾
這個select查詢先根據uid和name進行屬性投影,而不是將屬性全部取出以後再進行過濾
將這兩個查詢條件聯接起來生成最終查詢結果

(6)緩衝組件:在通過Navicat等數據庫客戶端軟件進行數據庫查詢時,我們會發現,如果多次執行同一條查詢語句,除了第一次耗時比較長之外,後續的查詢耗時都會較短,這就是緩衝組件所起的作用。緩衝組件主要的作用就是查詢緩存,如果查詢緩存有命中的查詢結果,查詢語句就可以直接去查詢緩存中取數據。但是,緩存空間的大小肯定是有限制的,所以一般都是通過LRU算法將數據的冷端溢出,未來得及時刷新到磁盤的數據頁,叫髒頁。這個緩存機制是由一系列小緩存組成的。比如表緩存,記錄緩存,key緩存,權限緩存等,如果當然,一旦有數據寫操作時,緩衝中的數據自然會失效。只有多次對於同一條SQL語句的查詢才能看到緩存現象。

(7)插件式存儲引擎(MySQL中的存儲引擎是基於表的,而不是數據庫的):對於不同的存儲引擎,其數據文件格式、存儲方式、SQL執行接口實現都不相同,在實際應用中,我們需要依據表中存儲的數據特性,爲該表選取合適的數據庫存儲引擎。

(8)物理文件系統:存儲的應用數據、操作日誌數據等都會在文件系統中進行存儲。

2. 存儲引擎

    MySQL中的存儲引擎有很多種,使用最多的就是innoDB存儲引擎了,每個引擎都有一些不同之處,其支持的特性如下:

(1)innoDB存儲引擎:MySQL的默認存儲引擎,面向OLTP(online transaction processing,即在線事務處理)、行鎖以及表鎖、支持外鍵、非鎖定讀(默認讀操作不會加鎖);

通過MVCC實現(多版本併發控制)來實現高併發,並實現了四種事務隔離級別,分別是讀未提交、讀已提交、可重複讀以及序列化,默認採用可重複讀,通過next-keylocking策略避免幻讀、插入緩衝、二次寫、自適應哈希索引、預讀。

對於表中數據的存儲,innoDB採用了聚集方式,也就是表中每條數據的存放都是按照主鍵的順序存儲,如果沒有顯式的指定表中的主鍵,那麼innoDB會自動爲每一行數據生成一個6字節的rowid字段作爲主鍵。.idb文件就是innoDB存儲引擎生成的表數據文件。

(2)MyISAM存儲引擎: 不支持事務、表鎖、全文索引、適合olap(在線分析處理),其中.myd文件放具體數據,.myi文件放索引數據。對於MyISAM引擎表,MySQL數據庫只會緩存其索引文件,也就是myi

(3)ndb存儲引擎: 集羣存儲引擎,share nothing,可提高可用性,該引擎會將所有數據全部存儲在內存中。

(4)Memory存儲引擎: 數據存放在內存中,表鎖,併發性能差,默認使用哈希索引

(5)Archive存儲引擎:只支持insert和select zlib算法壓縮1:10,適合存儲歸檔數據如日誌等、行鎖

(6)Maria存儲引擎: 目的取代myisam、緩存數據和索引、行鎖、mvcc

可以通過show engines;指令來查看MySQL數據支持的存儲引擎。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章