一、關係型資料庫與非關係型資料庫
1、關係型資料庫的特點:
1)資料以表格的形式出現
2)每行為各種記錄名稱
#3)每列為記錄名稱所對應的資料域
4)許多的行和列組成一張表單
# 5)若干的表單組成資料庫
2、關係型資料庫的優點:
1)複雜的查詢:可以使用SQL語句方便地在一個表格以及多個表格之間做非常複雜的資料查詢。
2)事務支援:使得對於安全效能很高的資料存取要求得以實現。
3、非關係型資料庫的優點:
1)效能:NOSQL是基於鍵值對的,可以想像成表中的主鍵和值的對應關係,不需要經過SQL層的解析,所以效能非常高。
2)可擴展性:同樣也是因為基於鍵值對,資料之間沒有耦合性,所以非常容易水平擴展。
問題:三種傳統資料庫之間的差異?
答:三者之間是根據資料之間的聯繫而去別的,層次性資料庫是樹狀結構、網狀型資料庫是連結指標結構、關係型資料庫是二維表結構。
二、事務(ACID)
#交易(transaction)是作為單一邏輯工作單元執行的一系列操作,這些操作作為一個整體一起向系統提交,要么都執行,要么都不執行。 事務是一個不可分割的工作邏輯單元。
交易必須具備以下四個屬性,簡稱ACID屬性:
原子性(atomicity) :事務是一個完整的操作。事物的各部操作是不可分的(原子的);要么都執行,要么都不執行;
一致性(consistency):當事務完成時,資料必須處於一致狀態;
隔離性(isolation):對資料進行修改的所有並發事務是彼此隔離的,這表明事務必須是獨立的,它不應以任何形式依賴或影響其他事務;
永久性(durability):事務完成後,它對資料庫的修改是永久的,事務日誌能夠保持事務的永久性。
交易的隔離等級:
#讀取未提交內容(又稱髒讀read uncommitted):指所有交易都可以看到其他未提交交易的執行結果。可能有髒讀、不可重複讀和幻讀問題。
讀取提交內容(read commited):一個交易只能看見已經提交的事務所所做的改變。可以避免髒讀,可能有不可重複讀和幻讀問題。
可重複讀取(repeatable read):是MySQL的預設交易隔離級別,它確保相同交易的多個實例在並發讀取資料時,會看到同樣的數據行。可以避免髒讀和不可重複讀,可能會有幻讀問題。
可串行化(serializable):是最高的隔離級別,它透過在每個讀取的資料行上加上共享鎖,使其不可能相互衝突,從而解決幻讀問題。可以避免髒讀、不可重複讀、幻讀。
並發交易帶來的問題:
1.更新遺失:兩個事務T1和T2讀入了相同資料並修改,T2提交的結果覆蓋了T1提交的結果,導致T1的修改被遺失。
2.髒讀:事務T1修改了某一數據,並將其寫回磁盤,事務T2讀取同一數據後,T1由於某種原因被撤銷,這時T1已修改過的數據恢復原值,T2讀到的數據就與資料庫中的數據不一致,則T2讀到的數據就為「髒」數據,即不正確的數據。
3.不可重複讀取:是指在一個交易內,多次讀取相同資料。在這個事務還沒結束時,另外一個事務也存取了該相同資料。那麼,在第一個事務中的兩次讀取資料之間,由於第二個事務的修改,那麼第一個事務兩次讀到的資料可能是不一樣的。這就發生了在一個事務內兩次相同的查詢讀到的資料是不一樣的,因此稱為是不可重複讀。
4.幻讀:例如:目前薪資為5000的員工有10人,事務A讀取所有薪資為5000的人數為10人。此時,事務B插入了一則薪資也為5000的記錄。這時,事務A再次讀取薪資為5000的員工,記錄為11人。此時就產生了幻讀。
不可重複讀取和幻讀的差別? 不可重複讀取的重點是修改,幻讀的重點在於新增或刪除。
MVCC(多重版本並發控制機制):InnoDB的MVCC,是透過在每行記錄後面保存兩個隱藏的列來實現的。分別保存了行的建立時間和行的刪除時間(這裡儲存的並不是實際的時間值,而是系統版本號)。每開始一個新的事務,系統版本號就會自動遞增。事務開始時刻的系統版本號碼會作為事務的ID,用來和查詢到的每行記錄的版本號進行比較,使用MVCC後可重複讀取隔離級別下不會出現幻讀現象。
三、儲存引擎
儲存引擎是資料庫底層軟體組織,資料庫管理系統(DBMS)使用資料引擎進行建立、查詢、更新和刪除資料。
1、InnoDB(聚集索引方式)
#innodb底層儲存結構為B 樹,樹的每個節點對應innodb的一個page ,page的大小是固定的,一般設為16K。其中非葉子節點只有鍵值,葉子節點包含完整資料。
使用場景:1)經常更新的表,是和處理多重並發的更新請求;
2)支援事務安全表( ACID),支援行鎖和外鍵;
3)可以透過bin-log日誌等恢復
innodb如果沒有設定主鍵,就會自動產生一個6位元組的主鍵(使用者不可見)。
2、MyISAM(非叢集索引方式)
#MyISAM在5.1之前是MySQL的預設儲存引擎,它強調的是效能,但是它不支援事務、也不支援行鎖和外鍵,支援表鎖;當插入或更新資料時,需要鎖住整個表,效率就會低一些。只快取索引,不快取真實資料。 MyISAM讀取資料時速度很快,而且不佔用大量的記憶體和儲存資源。
MyISAM允許沒有主鍵的存在,是一種靜態索引結構。
問題:MySQL中MyISAM與InnoDB的差別?
#答案:MySQL資料庫中,最常用的兩種引擎是innodb和myisam。 InnoDB是目前MySQL的預設儲存引擎。
1)事務方面:MyISAM強調的是效能,查詢速度比InnoDB類型更快,但不支援交易。 InnoDB提供事務支援。
2)外鍵:MyISAM不支援外鍵,InnoDB支援外鍵。
3)鎖:MyISAM只支援表格級鎖,InnoDB支援行級鎖和表級鎖,預設為行級鎖,行鎖大幅提高了多用戶並發操作的性能。 innodb比較適合插入和更新作業比較多的情況,而myisam則適合頻繁查詢的情況。另外,innodb表的行鎖也不是絕對的,如果在執行一個SQL語句時,MySQL不能確定要掃描的範圍,innodb同樣會鎖全表,例如:update table set num=1 where name like "�a% "。
4)全文索引:MyISAM支援全文索引,Innodb不支援全文索引。 innodb從MySQL5.6之後提供全文索引的支援。
5)表主鍵:myisam允許沒有主鍵的表存在;innodb:如果沒有設定主鍵,就會自動產生一個6位元組的主鍵(使用者不可見)。
6)表的具體行數:myisam:select count(*) from table,myisam只要簡單的讀出保存好的行數。因為myisam內建了一個計數器,count(*)時它直接從計數器中讀取。
innodb: does not save the specific number of rows in the table. That is to say, when executing select count(*) from table, innodb will scan the entire table to calculate how many rows there are.
Recommended learning: MySQL tutorial
以上是詳解MySQL資料庫之事務及儲存引擎的詳細內容。更多資訊請關注PHP中文網其他相關文章!