mysql由以下幾個部分組成:
連線池元件
管理服務和工具元件
sql介面組價
查詢分析器組價
優化器組價
快取(cache)組價
外掛程式式儲存引擎
物理檔案。
可以看出,mysql資料庫區別於其他資料庫的最重要的乙個特點就是其外掛程式式的表儲存引擎。儲存引擎是基於表的,而不是資料庫。是底層物理結構的實現,每個儲存引擎開發者可以按照自己的意願來開發。
mysql資料庫的核心在於儲存引擎。innodb甚至是mysql資料庫oltp應用中使用最廣泛的儲存引擎。
innodb儲存引擎:
第乙個完整支援acid事務mysql儲存引擎
myisam:
不支援事務,表鎖設計,支援全文索引,只要面向一些olap的資料庫應用。緩衝池只快取索引檔案,而不是資料檔案,這點和大多數的資料庫都非常不同。
innodb體系架構:
1.後台執行緒:
1)master thread
2)io thread
3)purge thread
4)page cleaner thread
2.記憶體
1)緩衝池
2)lru list、free list和flush list
3)重做日誌緩衝
4)額外的記憶體池
ndb:
是乙個集群儲存引擎,類似於oracle的rac集群。ndb的特點使資料全部放在記憶體中(5.1以後可以將非索引資料放在磁碟上),因此主鍵查詢的速度極快,並且通過新增ndb資料儲存節點可以先行地提高資料庫效能,是高可用、高效能的集群系統。ndb的鏈結操作join實在mysql資料庫層完成的,而不是儲存引擎層,意味著負責連線操作需要巨大的網路開銷,查詢速度很慢。
memory儲存引擎:
將表中的資料存放在記憶體中,如果資料重啟或發生崩潰,表中的資料將消失。非常適合儲存臨時資料的臨時表,以及資料倉儲中的維度表。預設使用雜湊索引,而不是我們熟悉的b+數索引。雖然速度快,只支援表鎖,併發效能較差,並且不支援text和bolb型別。儲存變長字段varchar是按照定長字段(char)的方式進行的,因此會浪費記憶體。
achive儲存引擎:
只支援insert和select。5.1以後開始支援索引。使用zlib演算法將資料行進行壓縮後儲存,壓縮比一般可達1:10,。非常適合儲存歸檔資訊,如日誌資訊。使用行鎖來實現高併發的插入操作,但是其本身並不是事務安全的儲存引擎,其設計目標主要是提高告訴的插入和壓縮功能。
federated儲存引擎:
並不儲存表,只是指向一台遠端mysql資料庫伺服器上的表。
maria儲存引擎:
新開發的引擎,可以看成是myisam的後續版本。特點:支援快取資料和索引檔案,應用了行鎖設計,提供了mvcc功能,支援事務和非事務安全的選項,以及更好的blob字元型別的處理效能。
第四章 表
4.1索引組織表
在innodb儲存引擎中,表都是根據元件順序組織存放的。這種儲存方式的表稱為索引組織表。在inndb儲存引擎中,每張表都有個主鍵,如果在建立表時沒有顯示的定義主鍵,則inndb儲存引擎會按如下方式選擇或建立主鍵:
1)首先判斷表中是否有非空的唯一索引。如果有,則該列即為主鍵。
2)如果不符合上述條件,innodb儲存引擎自動建立乙個六位元組大小的指標。
當表中多個非空唯一索引時。inndb儲存引擎將選擇見表時第乙個定義的非空唯一索引主鍵
段:表空間是由各個段組成的,常見的段有資料段、索引段、回滾段等。innodb儲存引擎表示索引組織的,因此資料即索引,索引即資料。那麼資料段即為b+數的葉子節點,索引段即為b+數的非索引節點。
區:區是由連續頁組成的空間,在任何情況下每個區的大小都是1mb。為了保證區中頁的連續性,innodb儲存引擎一次從磁碟申請4-5個區。預設情況下,innodb儲存引擎頁的大小為16kb,即乙個區中一共有64個連續的頁。
頁:頁是innodb磁碟管理的最小單位。innodb中,預設每個頁大小為16kb。
常見的頁型別有:資料頁,undo頁,系統頁,事務資料頁,插入緩衝點陣圖頁,插入緩衝空閒列表頁、未壓縮的二進位製大物件頁、壓縮的二級製大物件頁。
行:innodb儲存引擎是面向行的,也就是資料是按行進行存放的。
mysql infobright儲存引擎就是按列來存放資料的。類似的還有sybase iq、google big table,這對於資料倉儲下的分析類sql語句的執行及資料壓縮非常有幫助。
行記錄格式:compact和redundant
varchar型別可以存放65535位元組(實際是65532左右,有其他開銷)
其中65535長度是多元varchar長度總和。
4.6約束
資料完整性有以下三種形式:
實體完整性、域完整性還有參照完整性。
實體完整性:保證表中有乙個主鍵
域完整性:保證資料每列的值滿足特定的條件。
參照完整性:保證兩張表之間的關係。
4.7檢視
在mysql中,檢視是乙個命名的虛表,它由乙個sql查詢來定義,可以當做表使用。與持久表不同的是,檢視中的資料沒有實際的物理儲存。
檢視的作用:被當做乙個抽象裝置,特別是對於一些應用程式,程式本身不需要關心基表的結構,只需要按照檢視定義來取資料或更新資料,因此在一定程度上起到乙個安全層的作用。
4.8分割槽表
分割槽功能並不是在儲存引擎層完成的,因此不是只有innodb才支援分割槽,常見的儲存引擎innodb、myisam、nbd都支援,有些如csv、fedorated、merge等不支援。
分割槽:將乙個表或索引分解為更小、更可管理的部分。邏輯上來講,只有乙個表或索引,但是物理上這個表或索引可能由數十個物理分割槽組成。mysql支援水平分割槽,不支援垂直分割槽。此外,mysql資料庫的分割槽是區域性分割槽索引,乙個分割槽中既放了資料又放了索引。而全域性分割槽是指,資料存放在各個分割槽中,但是索引資料的索引放在乙個物件中。mysql暫時不支援全域性分割槽。
分割槽型別:range分割槽、list分割槽、hash分割槽、key分割槽、column分割槽。
一般情況下:olap應用如資料倉儲、資料集市,分割槽的確是可以很好的挺高查詢的效能,因為olap應用大多數查詢需要頻繁地掃瞄一張很大的表。對於oltp應用,分割槽應該格外小心。b+樹索引可以很好的完成操作,不需要分割槽的幫助,並且設計不好的分割槽會帶來嚴重的效能問題。
第5章 索引
索引太多,應用程式的效能可能會受到影響。而索引太少,對查詢效能又會產出影響,要找到乙個平衡點。
innodb支援的索引:
b+樹索引
全文索引
雜湊索引:innodb支援的雜湊索引是自適應的,會根據表的使用情況自動為表生成雜湊索引,不能人為干預是否在一張表中生成雜湊索引。
b+樹:並不能找到乙個給定健值的具體行,能找到的知識被查詢資料行所在的頁。然後資料庫通過頁讀入到記憶體,再在記憶體中進行查詢,最後得到要查詢的資料。是目前關係型資料庫系統中查詢最為常用和最有效的索引。
b+樹索引分為聚集索引和輔助索引。葉子節點存放著索引的資料。聚集索引與輔助索引不同的是,葉子節點存放的是否是一整行的資訊。
聚集索引:按照每張表的主鍵構造一顆b+樹,同時葉子節點中存放的即為整張表的行記錄資料,也將聚集索引的葉子節點成為資料頁。聚集索引的這個特徵決定了索引組織表中資料也是索引的一部分。每張表只能有乙個聚集索引。在多數情況下,查詢優化器傾向於採用聚集索引。因為聚集索引能夠在b+樹索引的葉子節點上直接找到資料。由於定義了資料的邏輯結構,聚集索引能夠特別快的訪問針對範圍值的查詢。
輔助索引(非聚集索引):葉子節點並不包含行記錄的全部資料。
讀MySQL技術內幕筆記
1.mysql 單程序多執行緒 2.資料庫和例項的定義 3.mysql組成部門 連線池元件 管理服務和工具元件 sql介面元件 查詢分析器元件 優化器元件 緩衝 cache 元件 外掛程式式儲存引擎 物理檔案 4.innodb後台執行緒 master thread io thread purge 清...
MySQL技術內幕
innodb儲存引擎是事物安全的儲存引擎。innodb儲存引擎有多個記憶體塊,這些記憶體塊組成乙個很大的記憶體池,負責如下的工作 後台執行緒 innodb儲存引擎是多執行緒模型,因此他有多個不同的後台執行緒,負責處理不同的任務。記憶體日誌檔案 記錄mysql對某種條件做出響應時的檔案,如錯誤日誌檔案...
MySQL技術內幕(一)
1.mysql是一種可移植的資料庫,可在多種平台下使用,如linux,solaris,freebsd,mac,windows 2.資料庫和資料庫例項的區別 資料庫是指物理上儲存的檔案的集合 資料庫例項是由後台的執行緒 程序和共享記憶體區組成,操縱資料庫檔案。3.mysql區別於其他資料庫的最重要的特...