一、關係型資料庫
1. 關係型資料庫(RDBMS)
建立在關係模型基礎上,由多張相互連線的二維表組成的資料庫。也就是將資料以表的形式儲存並且這些表存在相互聯絡。表是由行和列組成。
2. 關係型資料庫的設計正規化
設計關聯式資料庫時,遵從不同的規範要求,設計出合理的關係型資料庫,這些不同的規範要求被稱為不同的正規化,各種正規化呈遞次規範,越高的正規化資料庫冗餘越小。
通俗的理解就是設計資料庫表、表和表之間的關係的時候,需要遵循的規範,從而避免資料的冗餘儲存,避免造成大量儲存空間浪費,所以定義了資料庫的正規化。
目前關聯式資料庫有六種正規化:第一正規化(1NF)、第二正規化(2NF)、第三正規化(3NF)、巴德斯科正規化(BCNF)、第四正規化(4NF)和第五正規化(5NF,又稱完美正規化)。
滿足最低要求的正規化是第一正規化(1NF)。在第一正規化的基礎上進一步滿足更多規範要求的稱為第二正規化(2NF),其餘正規化以次類推。一般說來,資料庫只需滿足第三正規化(3NF)就行了。
(1) 第一正規化(1NF)
所謂第一正規化(1NF)是指在關係模型中,對域新增的一個規範要求,所有的域都應該是原子性的,即資料庫表的每一列都是不可分割的原子資料項,而不能是集合,陣列,記錄等非原子資料項。即實體中的某個屬性有多個值時,必須拆分為不同的屬性。在符合第一正規化(1NF)表中的每個域值只能是實體的一個屬性或一個屬性的一部分。簡而言之,第一正規化就是無重複的域。
說明:在任何一個關聯式資料庫中,第一正規化(1NF)是對關係模式的設計基本要求,一般設計中都必須滿足第一正規化(1NF)。不過有些關係模型中突破了1NF的限制,這種稱為非1NF的關係模型。換句話說,是否必須滿足1NF的最低要求,主要依賴於所使用的關係模型。
(2) 第二正規化(2NF)
第二正規化(2NF)是在第一正規化(1NF)的基礎上建立起來的,即滿足第二正規化(2NF)必須先滿足第一正規化(1NF)。第二正規化(2NF)要求資料庫表中的每個例項(行)或記錄必須可以被唯一地區分。選取一個能區分每個實體的屬性或屬性組,作為實體的唯一標識。
第二正規化(2NF)要求實體的屬性完全依賴於主關鍵字。所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那麼這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關係。為實現區分通常需要為表加上一個列,以儲存各個例項的唯一標識。簡而言之,第二正規化就是在第一正規化的基礎上屬性完全依賴於主鍵。
(3) 第三正規化(3NF)
第三正規化(3NF)是第二正規化(2NF)的一個子集,即滿足第三正規化(3NF)必須滿足第二正規化(2NF)。簡而言之,第三正規化(3NF)要求一個關係中不能包含已在其它關係已包含的非主關鍵字資訊。簡而言之,第三正規化就是屬性不依賴於其它非主屬性,也就是在滿足2NF的基礎上,任何非主屬性不得傳遞依賴於主屬性。
第三正規化要求表與表之間的關係
3. 表連線
兩張表透過某種關係建立連線,用來查詢資料。
連線的本質就是把各個連線表中的記錄都取出來依次匹配的組合加⼊結果集並返回給使用者。
把多張表記錄連起來組成新的更大的記錄,所以這個查詢過程稱之為連線查詢
4. 事務
事務(Transaction)是一組SQL組成的執行單元(Unit),是資料庫併發控制和恢復回滾的基本單位。一個事務中可能包含多個SQL,要麼都失敗,要麼都成功。
把需要保證原子性、隔離性、一致性和永續性的一個或多個資料庫操作稱之為一個事務(英文名是:transaction)。
一個儲存系統是否支援事務,測試標準:
ACID:
A:原子性;
C:一致性;
I:隔離性;
D:永續性;
5. 約束
向資料表插入的資料要遵守的限制規則;
如將一個人的年齡寫入表中,誤將他的年齡寫成260年,資料庫表能夠自動檢測這種違反法則的機制叫做約束。
主鍵:一個或多個欄位的組合,填入主鍵中的資料,必須不同於已存在的資料;不能為空;一個表只能存在一個;
外來鍵:一個表中某欄位中能插入的資料,取決於另外一張表的主鍵中的資料;
惟一鍵:一個或多個欄位的組合,填入惟一鍵中的資料,必須不同於已存在的資料;可以為空;一個表可以存在多個;
檢查性約束:取決於表示式的要求;
6. 索引
沒有索引,查詢一條資料,只能遍歷表中的所有行。
可以把一個欄位抽取出來,進行重新排序,排序以後再查詢。
將表中的一個或多個欄位中的資料複製一份另存,並且此些需要按特定次序排序儲存;
索引(index)是幫助MySQL高效獲取資料的資料結構(有序)。
在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用(指向)資料, 這樣就可以在這些資料結構上實現高階查詢演算法,這種資料結構就是索引。
索引結構 | 描述 |
---|---|
B+Tree | 最常見的索引型別,大部分引擎都支援B+樹索引 |
Hash | 底層資料結構是用雜湊表實現,只有精確匹配索引列的查詢才有效,不支援範圍查詢 |
R-Tree(空間索引) | 空間索引是 MyISAM 引擎的一個特殊索引型別,主要用於地理空間資料型別,通常使用較少 |
Full-Text(全文索引) | 是一種透過建立倒排索引,快速匹配文件的方式,類似於 Lucene, Solr, ES |
7. 關係運算
當查詢表中的資料時,涉及到表和表之間的連線運算。
選擇:挑選出符合條件的行;
投影:挑選出符合需要的列;
連線:將多張表關聯起來;
二、Mysql架構
1.Connectors
指的是不同語言中與SQL的互動,如php、java等。
2 Management Serveices & Utilities:
系統管理和控制工具
3 Connection Pool: 連線池
管理緩衝使用者連線,執行緒處理等需要快取的需求。
負責監聽對 MySQL Server 的各種請求,接收連線請求,轉發所有連線請求到執行緒管理模組。每一個連線上 MySQL Server 的客戶端請求都會被分配(或建立)一個連線執行緒為其單獨服務。
而連線執行緒的主要工作就是負責 MySQL Server 與客戶端的通訊,
接受客戶端的命令請求,傳遞 Server 端的結果資訊等。執行緒管理模組則負責管理維護這些連線執行緒。包括執行緒的建立,執行緒的 cache 等。
4 SQL Interface: SQL介面。
接受使用者的SQL命令,並且返回使用者需要查詢的結果。比如select from就是呼叫SQL Interface
5 Parser: 解析器。
SQL命令傳遞到解析器的時候會被解析器驗證和解析。解析器是由Lex和YACC實現的,是一個很長的指令碼。
在 MySQL中我們習慣將所有 Client 端傳送給 Server 端的命令都稱為 query ,在 MySQL Server 裡面,連線執行緒接收到客戶端的一個 Query 後,會直接將該 query 傳遞給專門負責將各種 Query 進行分類然後轉發給各個對應的處理模組。
主要功能:
a. 將SQL語句進行語義和語法的分析,分解成資料結構,然後按照不同的操作型別進行分類,然後做出針對性的轉發到後續步驟,以後SQL語句的傳遞和處理就是基於這個結構的。
b. 如果在分解構成中遇到錯誤,那麼就說明這個sql語句是不合理的
6 Optimizer: 查詢最佳化器。
SQL語句在查詢之前會使用查詢最佳化器對查詢進行最佳化。就是最佳化客戶端請求的 query(sql語句) ,根據客戶端請求的 query 語句,和資料庫中的一些統計資訊,在一系列演算法的基礎上進行分析,得出一個最優的策略,告訴後面的程式如何取得這個 query 語句的結果
他使用的是“選取-投影-聯接”策略進行查詢。
用一個例子就可以理解: select uid,name from user where gender = 1;
這個select 查詢先根據where 語句進行選取,而不是先將表全部查詢出來以後再進行gender過濾
這個select查詢先根據uid和name進行屬性投影,而不是將屬性全部取出以後再進行過濾
將這兩個查詢條件聯接起來生成最終查詢結果
7 Cache和Buffer: 查詢快取。
熱點資料載入記憶體中,加速查詢過程。
Cache:主要功能是將客戶端提交 給MySQL 的 Select 類 query 請求的返回結果集 cache 到記憶體中,與該 query 的一個 hash 值 做一個對應。該 Query 所取資料的基表發生任何資料的變化之後, MySQL 會自動使該 query 的Cache 失效。在讀寫比例非常高的應用系統中, Query Cache 對效能的提高是非常顯著的。當然它對記憶體的消耗也是非常大的。
如果查詢快取有命中的查詢結果,查詢語句就可以直接去查詢快取中取資料。這個快取機制是由一系列小快取組成的。比如表快取,記錄快取,key快取,許可權快取等
buffer與cache的區別?
快取那裡實際上有buffer和cache兩個,那它們之間是否有什麼不同呢?簡單的說就是,buffer是寫快取,cache是讀快取。
8 、儲存引擎介面
儲存引擎介面模組可以說是 MySQL 資料庫中最有特色的一點了。目前各種資料庫產品中,基本上只有 MySQL 可以實現其底層資料儲存引擎的外掛式管理。這個模組實際上只是 一個抽象類,但正是因為它成功地將各種資料處理高度抽象化,才成就了今天 MySQL 可插拔儲存引擎的特色。
從圖還可以看出,MySQL區別於其他資料庫的最重要的特點就是其外掛式的表儲存引擎。MySQL外掛式的儲存引擎架構提供了一系列標準的管理和服務支援,這些標準與儲存引擎本身無關,可能是每個資料庫系統本身都必需的,如SQL分析器和最佳化器等,而儲存引擎是底層物理結構的實現,每個儲存引擎開發者都可以按照自己的意願來進行開發。
注意:儲存引擎是基於表的,而不是資料庫。
三、SQL SELECT語句執行過程
MySQL 整個查詢執行過程,總的來說分為 6 個步驟 :
SQL執行步驟:請求、快取、SQL解析、最佳化SQL查詢、呼叫引擎執行,返回結果
1、連線:客戶端向 MySQL 伺服器傳送一條查詢請求,與connectors互動:連線池認證相關處理。
2、快取:伺服器首先檢查查詢快取,如果命中快取,則立刻返回儲存在快取中的結果,否則進入下一階段
3、解析:伺服器進行SQL解析(詞法語法)、預處理。
4、最佳化:再由最佳化器生成對應的執行計劃。
5、執行:MySQL 根據執行計劃,呼叫儲存引擎的 API來執行查詢。
6、結果:將結果返回給客戶端,同時快取查詢結果。
四、參考
https://cloud.tencent.com/developer/article/1981543