MySQL技術總結第一篇

(答辯完成,接下來一段時間會抓緊學習,月底回國。)

拿兩三篇總結MySQL的知識點,補上之前的坑。這裏第一篇主要講粗略講一下MySQL體系結構和存儲引擎,通過對MySQL大體的認識,連帶補充一些關於InnoDB的特性。


一,MySQL體系結構

1.1 什麼是數據庫,MySQL和SQL

首先講數據庫,

數據庫(DB)是文件的集合,是依照某種數據模型組織起來並存放於二級存儲器中的數據集合。通俗講,數據庫就是存放數據的倉庫。

數據庫管理系統(DBMS)就是用來管理數據庫的,在用戶與操作系統之間,由相互關聯的數據集合以及一組用於訪問這些數據的程序組成。

數據庫系統(DBS)是一個通稱,包括數據庫、數據庫管理系統、數據庫管理人員等的統稱,是最大的範疇。詳細點說,DBS是實現有組織的、動態的存儲大量關聯數據、方便多用戶訪問的計算機硬件、軟件(包括操作系統、應用程序、DBMS)、數據資源、人員(數據庫管理員、使用者等)組成的系統。


現在講什麼是MySQL和SQL

MySQL 是最流行的關係型數據庫管理系統(RDBMS),在 WEB 應用方面 MySQL 是最好的 RDBMS應用軟件之一,而SQL是用來操作數據庫裏數據的語言(工具)。

SQL,指結構化查詢語言,全稱是 Structured Query Language。其中SQL與NoSQL的區別見這篇文章

回到SQL和MySQl,來源知乎的一個例子比較形象:例如有一碗米飯(碗就是mysql,裏面放的米是數據),你要喫碗裏的米飯,拿什麼喫?拿筷子(sql)。用筷子(sql)操作碗裏(mysql)的米飯(數據)

我們規定一個數據庫實例是位於用戶和操作系統之間的一層數據管理軟件的程序,用戶對數據庫的任何操作都是在數據庫實例下進行的。


1.2 MySQL的認識與體系架構

現在我們知道了MySQl是一種RDBMS,是位於用戶和操作系統之間的一層數據管理軟件。那用戶對數據庫的任何操作都是在一個MySQL下的一個數據庫實例下進行的。不過由於我們一般會淡化DB,DBMS和DBS之間的關係,只有在較真的情況下才會區別,所以以下篇幅中,會把MySQL數據庫管理系統簡化稱爲MySQL數據庫。

在linux中通過以下命令啓動MySQL實例,並通過命令ps觀察MySQL啓動後的進程情況。(挖坑)

我們發現MySQL是一個單進程多線程架構的數據庫,由後臺線程以及一個共享內存區組成。官網中的體系結構如圖

我們發現,MySQL由很多部分組成,其中很多是所有數據庫都需要完成的,比如SQL分析器和優化器,然而MySQL的重要特點之一是插件式的存儲引擎架構,存儲引擎是物理架構的實現,基於表操作,每個存儲引擎開發者可以按照自己的意願來開發,具體存儲引擎的部分會在下面部分講。


從體系架構得到的MySQL總體的三個問題及解答:

MySQL支持全文索引嗎?---> MySQL的MyISAM, Sphinx,新版InnoDB存儲引擎都支持全文索引
MySQL速度快是因爲它不支持事務嗎?---》MyISAM不支持事務,所以對於ETL這種操作,會有優勢;InnoDB支持事務,在OLTP環境中效率變高。
數據量大於1000萬時MySQL性能急劇下降怎麼辦?---》優化SQL和索引->加緩存redis->主從複製,讀寫分離,防止掃描全區->垂直拆分,變成分佈式系統->水平拆分,分數據量過大的表

通過這三個問題,解決問題是一方面,還有了解存儲引擎在MySQl的重要性。


1.3 連接MySQL數據庫的常用方式
TCP/IP套接字(跨平臺)
命名管道和共享內存(Windows,進程通信在同一服務器)
Unix域套接字(Unix,不是網絡協議,所以只有在客戶端和數據庫實例在一臺機器上可用)


二,MySQL存儲引擎綜述

MySQL存儲引擎有很多,一般用到的是MyISAM和InnoDB。

2.1 InnoDB存儲引擎:
支持事務

行鎖設計

支持外鍵

支持非鎖定讀(默認讀不會產生鎖)

實現MVCC多版本併發控制獲得高併發性,實現SQL的四種隔離級別,默認爲可重複讀。使用next-keylocking的策略來避免幻讀。

提供插入緩衝,二次寫,自適應哈希索引,預讀等功能。

聚集索引:對於表中數據的存儲,InnoDB存儲引擎採用了聚集索引的方式,因此每張表的存儲都是按主鍵的順序存放,如果沒有顯式指定主鍵,就會爲每一行生成一個6字節的RowID,並以此爲主鍵。

InnoDB支持崩潰後的安全恢復。

(補充:MVCC 的機制:通過時間戳,遞增事務實現事務一致性,使每個連接到數據庫的讀者,在某個瞬間看到的是數據庫的一個快照,寫者寫操作造成的變化在寫操作完成之前(或者數據庫事務提交之前)對於其他的讀者來說是不可見的。
當一個 MVCC 數據庫需要更一個一條數據記錄的時候,它不會直接用新數據覆蓋舊數據,而是將舊數據標記爲過時(obsolete)並在別處增加新版本的數據。這樣就會有存儲多個版本的數據,但是隻有一個是最新的。)


2.2 MyISAM存儲引擎:

不支持事務

表鎖設計

支持全文索引,InnoDB不保存表的具體行數,執行select count(*) from table時需要全表掃描。而MyISAM用一個變量保存了整個表的行數,執行上述語句時只需要讀出該變量即可,速度很快。

非聚集索引,緩衝池中只緩存索引文件,而不緩存數據文件。存儲引擎表由存放數據文件的MYD和存放索引文件的MYI組成。

讀效率高


三,InnoDB存儲引擎

InnoDB存儲引擎
3.1 OLAP和OLTP的區別與聯繫

數據庫與傳統文件系統最大的區別在於DB支持事務。
當今的數據處理大致可以分成兩大類:聯機事務處理OLTP(on-line transaction processing)、聯機分析處理OLAP(On-Line Analytical Processing)。
OLTP是傳統的關係型數據庫的主要應用,主要是基本的、日常的事務處理,例如銀行交易。
OLAP是數據倉庫系統的主要應用,支持複雜的分析操作,側重決策支持,並且提供直觀易懂的查詢結果。


 

3.2 InnoDB體系架構:


總結:

1. 後臺線程需要訪問的多個內部數據結構,主線程負責緩存異步刷新到磁盤,保持數據一致性
2. 內存緩存磁盤上的數據,方便讀取(LRU策略)
3. redo日誌緩衝
 


3.3 checkpoint技術

在以往數據庫容錯場景中,事務提交時,先做日誌,再修改頁,當發生宕機導致數據丟失時,通過重做日誌來完成數據恢復。可是緩衝越來越大,日誌越來越大的時候就會發生很多問題。

redo log記錄了數據操作在物理層面的修改,mysql中使用了大量緩存,緩存存在於內存中,修改操作時會直接修改內存,而不是立刻修改磁盤,當內存和磁盤的數據不一致時,稱內存中的數據爲髒頁(dirty page)。爲了保證數據的安全性,事務進行中時會不斷的產生redo log,在事務提交時進行一次flush操作,保存到磁盤中, redo log是按照順序寫入的,磁盤的順序讀寫的速度遠大於隨機讀寫。當數據庫或主機失效重啓時,會根據redo log進行數據的恢復,如果redo log中有事務提交,則進行事務提交修改數據。這樣實現了事務的原子性、一致性和持久性。

現在InnoDB加入checkpoint目的是:

1. 縮短數據庫恢復時間
2. 緩衝池不夠用時,將髒頁刷新到磁盤
3. redo日誌不可用時,刷新髒頁
數據庫不需要重做所有的日誌,因爲checkpoint之前的頁都已經刷新回磁盤,故數據庫只需要checkpoint後重做日誌進行恢復。

 

 

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