DBMS:數據庫管理系統數據庫
層次模型緩存
網狀模型安全
關係模型bash
RDBMS:關係型數據庫管理系統服務器
文件存儲:數據的冗餘和不一致性難以解決多線程
當數據量很大時,文件存儲的訪問很困難架構
當數據在不一樣的文件時,可能會形成數據的格式不一致,及數據太過於分散形成數據孤立併發
數據的完整性問題(如兩個銀行之間轉錢過程當中出現故障,要保證總額一致)ide
併發訪問異常(如多人同時訪問一個文件時,一我的在進行修改操做,其餘人就不能訪問)函數
原子性問題(數據從一個穩定狀態轉移到另外一個狀態)
安全性也得不到保障
1.表示層:文件或者表
2.邏輯層:文件系統或者存儲引擎
負責將底層的數據塊抽象爲文件供用戶查看;而在存儲數據時要靠文件系統將數據解構爲物理層的數據(即完成從表示層到物理層的映射)
3.物理層:數據塊,元數據
存儲引擎:能夠將文件系統理解文存儲引擎,將不一樣的格式的數據轉換爲表示層的文件,還能將文件存儲爲物理數據。這兩個過程的完成都要由存儲引擎來完成
關係:能夠將關係理解爲一張表
屬性:表中每個列描述一個屬性
實體:表中的每一行爲一個實體(記錄)
而整個表就是同一類實體的集合
E-R關係模型(即實體關係模型):將一個表拆分爲多個表(實體),下降數據的冗餘度
可以實現存儲在關係型數據庫中的關係模型有四種:
關係模型(結構化的數據模型):它的每一個字段都是有相同屬性的,如第一列爲Name,第二列爲Passwd
1.關係模型:靠一張二維表存儲數據,
2.實體關係型:將表拆分紅多個不一樣的實體,讓實體之間經過不一樣的約束創建聯繫
3.對象關係型模型:基於對象的數據類型
如:將一個很大的數據(如圖片)存儲在數據管理系統的某個空間上,並在表中用一個指針指向這個數據的存儲地址,將其基於對象進行管理
4.半結構化數據模型:在同一個表中每一行表示的數據可能不同;如
Name:Age:Gender
Name:UID:Birthdate
半結構化數據模型:在存儲時既要把數據存儲下來還要把數據定義的結構存儲下來,以XML(擴展標記語言)格式進行存儲
<name>Jerry</name>
<age>50</age>
gender:
而如今大多數的商業或者開源的關係型數據管理系統都能有效的處理以上四種數據模型
關係:代數運算(如求交集、並集、補集等等)
約束:如填入一個230的年齡數據庫必需要能檢測出來
域約束:數據類型約束,如必須填入int,填入char錯誤
外鍵約束:引用完整性約束。一個表中的字段必須與另外一個表中的字段相同而且其值要一一對應
主鍵約束:某字段(或多個字段組合)能惟一標識此行的實體
注:任意兩個實體在主鍵上不能出現相同值,而且不能爲空
如/etc/passwd 中的uid不一樣則能夠做爲主鍵、Name不一樣也能夠做爲主鍵
惟一性約束:沒一行的某字段都不容許出現相同的值,能夠爲空,且能夠有多個
注:因此一個表中只能有一個主鍵約束,但能夠有多個惟一性約束
檢查性約束:如age<100,age>0
注:MySQL對檢查性約束支持不強,但SQL—Server和Oracle支持較好
數據庫語言:
SQL(Structure Query Language):結構化查詢語言
DML:數據操做語言(增、刪、查、改)insert、delete、select、update
DDL:數據定義語言
定義RDB(數據庫對象):庫、表、索引、視圖、用戶。存儲過程、存儲函數、觸發器、事件調度器
Crete、Drop、Alter
DCL:數據控制語言,用來定義數據庫中用戶的訪問權限
查詢管理器功能:負責接收用戶的查詢、理解用戶查詢、並將用戶的查詢轉換爲對應的存儲管理器能夠理解的語言、而且要可以將數據在磁盤上存儲或者刪除
查詢管理器組件:
DML解釋器
DDL解釋器
查詢執行引擎
存儲管理器組件:
權限及完整性管理器
事務管理器(保證事務的完整性、原子性等)
文件管理器
緩衝區管理器(數據查詢存儲要先將數據緩存再內存中,緩衝區管理器用來管理緩存空間,如緩存哪些數據)
MySQL:單進程多線程模型
通常來講MySQL會爲每一個用戶的請求生成一個線程進行請求的響應,意味着一個用戶的全部操做(增、刪、查、改等)都在同一個線程中完成
MySQL的線程分爲:守護線程、應用線程
注:一般來講每一個查詢請求都要消耗大量的內存(如一個大的查詢可能要涉及到1G的數據量都有可能,而在32位系統上一個進程最多隻能使用2.7G的內存),因此MySQL的併發能力並非想象中的那麼大。因此在一個集羣中數據庫服務器可能會是整個系統中最慢的一個節點,所以要儘可能避免與數據庫的交互操做
那麼如何避免與數據庫的交互或者提升數據庫服務器的性能?
1.將第一次查詢的結果保存在緩存服務器中(varnish、memcache),當之後有相同的查詢請求時直接在緩存服務器中找
2.線程複用:如DisCuz論壇同一個用戶可能會每隔一段時間發一個帖子,而每次發帖對數據庫服務器來講都是一個新的請求,每次都要建立刪除線程太麻煩,能夠將線程實現屢次利用
3.使用性能好的服務器且OS爲64位
且MySQL對SMP(對稱多處理器)架構的cpu支持不好,MySQL能夠將多個查詢在不一樣CPU上處理,但不能講一個大的查詢分開在多個cpu上同時運行,即一個單獨語句只能在一個cpu上運行,這是MySQL不如orcale的一個很重要的緣由(即擴展性不行),可是能夠將每一個MySQL的功能作的簡單點,一個服務器只處理一點功能,作一個MySQL集羣,這樣能夠有效解決這個問題
關係運算:
投影 只輸出某個字段或者某個屬性
選擇 只輸出符合條件的行
天然選擇 在兩張表的對應字段經過等值關係創建的鏈接叫作天然鏈接
表1
A | 1 |
B | 2 |
C | 1 |
D | 3 |
表2
1 | bash |
2 | csh |
3 | zsh |
4 | ksh |
5 | tcsh |
天然鏈接後
A | 1 | 1 | bash |
B | 1 | 1 | bash |
C | 3 | 3 | zsh |
D | 2 | 2 | csh |
4.笛卡爾乘積
(a+b)*(c+d)=ac+ad+bc+bd
表1中每行與表2中每行分別鏈接=4*5=20行
一般笛卡爾乘積查找很慢,應儘可能避免
5.並
表1中一行 + 表2中一行 ==新的一行
MySQL的結構組成
表管理器:負責建立、讀取或修改表定義文件;維護表描述符高速緩存;管理表鎖;
表結構定義文件
表修改模塊:表建立、刪除、重命名、移除、更新或插入之類的操做;
表維護模塊:檢查、修改、備份、恢復、優化(碎片整理)及解析;
緩衝區管理器:有緩存置換策略,通常來講內存遠遠小於Disk,因此當操做涉及的數據量大於內存時,緩衝區管理器要按照緩存策略(如最近最少使用策略)進行數據塊的加載,移除等操做
數據在磁盤上的存儲:磁盤爲塊型設備,數據以塊(block)爲但爲單位進行存儲,在進行數據的讀取(I/O操做)時也只能以塊爲單位進行操做;而不能像字符型設備那樣直接進行按需求讀取所需的字符
而一個塊中每每保存着多個行(若是數據不是很大),若是將其中的某個行刪除,長時間下來會差生大量的數據縫隙,進而致使存儲空間的浪費,那麼如何利於數據縫隙?
每一個塊都有一個塊頭,通常有存儲引擎進行數據塊的管理,塊頭裏面記錄了保存有多少行,即哪裏是空白的,從而塊頭能夠方便的對磁盤進行數據整理,進而避免碎片的產生
塊頭(記錄了此塊中保存多少行,哪些未保存) |
縫隙(刪除致使的) |
數據1 |
縫隙 |
數據2 |
數據的記錄組織:
堆文件組織,數據能夠保存在文件中的任意一個位置;有利於存儲,不利於查找
順序文件組織,數據按照「搜索碼」進行順序存儲;不利於存儲,每次數據更新要從新排序,但有利於查找
散列文件存儲,數據的某個字段進行散列運算(hash運算,如取餘)而後根據不一樣的結果保存在不一樣的桶中
指針存儲,每行數據在存儲時還要記錄下一行的指針,這樣就不用按照順序進行存儲
表空間:將多個表的數據存放在同一個表空間中,標空間至關於一個更高級的數據存儲空間
數據字典:表、視圖等關係的元數據;如關係的名字、字段名稱、字段類型、字段長度、用戶名字、受權、密碼等