這篇文章將為大家詳細(xì)講解有關(guān)MySQL數(shù)據(jù)庫的知識點(diǎn),文章內(nèi)容質(zhì)量較高,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯(lián)專注于麻章企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城網(wǎng)站建設(shè)。麻章網(wǎng)站建設(shè)公司,為麻章等地區(qū)提供建站服務(wù)。全流程按需策劃,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
一、關(guān)系型數(shù)據(jù)庫與非關(guān)系型數(shù)據(jù)庫
1、關(guān)系型數(shù)據(jù)庫的特點(diǎn):
1)數(shù)據(jù)以表格的形式出現(xiàn)
2)每行為各種記錄名稱
3)每列為記錄名稱所對應(yīng)的數(shù)據(jù)域
4)許多的行和列組成一張表單
5)若干的表單組成數(shù)據(jù)庫
2、關(guān)系型數(shù)據(jù)庫的優(yōu)勢:
1)復(fù)雜的查詢:可以使用SQL語句方便地在一個表以及多個表之間做非常復(fù)雜的數(shù)據(jù)查詢。
2)事務(wù)支持:使得對于安全性能很高的數(shù)據(jù)訪問要求得以實(shí)現(xiàn)。
3、非關(guān)系型數(shù)據(jù)庫的優(yōu)勢:
1)性能:NOSQL是基于鍵值對的,可以想象成表中的主鍵和值的對應(yīng)關(guān)系,而且不需要經(jīng)過SQL層的解析,所以性能非常高。
2)可擴(kuò)展性:同樣也是因?yàn)榛阪I值對,數(shù)據(jù)之間沒有耦合性,所以非常容易水平擴(kuò)展。
三種傳統(tǒng)數(shù)據(jù)庫之間的區(qū)別
三者之間是根據(jù)數(shù)據(jù)之間的聯(lián)系而去別的,層次性數(shù)據(jù)庫是樹形結(jié)構(gòu)、網(wǎng)狀型數(shù)據(jù)庫是鏈接指針結(jié)構(gòu)、關(guān)系型數(shù)據(jù)庫是二維表結(jié)構(gòu)。
二、事務(wù)(ACID)
事務(wù)(transaction)是作為單個邏輯工作單元執(zhí)行的一系列操作,這些操作作為一個整體一起向系統(tǒng)提交,要么都執(zhí)行,要么都不執(zhí)行。事務(wù)是一個不可分割的工作邏輯單元。
事務(wù)必須具備以下四個屬性,簡稱ACID屬性:
原子性(atomicity):事務(wù)是一個完整的操作。事物的各部操作是不可分的(原子的);要么都執(zhí)行,要么都不執(zhí)行;
一致性(consistency):當(dāng)事務(wù)完成時(shí),數(shù)據(jù)必須處于一致狀態(tài);
隔離性(isolation):對數(shù)據(jù)進(jìn)行修改的所有并發(fā)事務(wù)是彼此隔離的,這表明事務(wù)必須是獨(dú)立的,它不應(yīng)以任何形式依賴于或影響其他事務(wù);
永久性(durability):事務(wù)完成后,它對數(shù)據(jù)庫的修改是永久的,事務(wù)日志能夠保持事務(wù)的永久性。
事務(wù)的隔離級別:
讀取未提交內(nèi)容(又稱為臟讀 read uncommitted):指所有事務(wù)都可以看到其他未提交事務(wù)的執(zhí)行結(jié)果??赡苡信K讀、不可重復(fù)讀和幻讀問題。
讀取提交內(nèi)容(read commited):一個事務(wù)只能看見已經(jīng)提交的事務(wù)所做的改變??梢员苊馀K讀,可能有不可重復(fù)讀和幻讀問題。
可重復(fù)讀(repeatable read):是MySQL的默認(rèn)事務(wù)隔離級別,它確保同一事務(wù)的多個實(shí)例在并發(fā)讀取數(shù)據(jù)時(shí),會看到同樣的數(shù)據(jù)行??梢员苊馀K讀和不可重復(fù)讀,可能會有幻讀問題。
可串行化(serializable):是最高的隔離級別,它通過在每個讀的數(shù)據(jù)行上加上共享鎖,使之不可能相互沖突,從而解決幻讀問題。可以避免臟讀、不可重復(fù)讀、幻讀。
并發(fā)事務(wù)帶來的問題:
1.更新丟失:兩個事務(wù)T1和T2讀入了同一數(shù)據(jù)并修改,T2提交的結(jié)果覆蓋了T1提交的結(jié)果,導(dǎo)致T1的修改被丟失。
2.臟讀:事務(wù)T1修改了某一數(shù)據(jù),并將其寫回磁盤,事務(wù)T2讀取同一數(shù)據(jù)后,T1由于某種原因被撤銷,這時(shí)T1已修改過的數(shù)據(jù)恢復(fù)原值,T2讀到的數(shù)據(jù)就與數(shù)據(jù)庫中的數(shù)據(jù)不一致,則T2讀到的數(shù)據(jù)就為“臟”數(shù)據(jù),即不正確的數(shù)據(jù)。
3.不可重復(fù)讀:是指在一個事務(wù)內(nèi),多次讀同一數(shù)據(jù)。在這個事務(wù)還沒有結(jié)束時(shí),另外一個事務(wù)也訪問了該同一數(shù)據(jù)。那么,在第一個事務(wù)中的兩次讀數(shù)據(jù)之間,由于第二個事務(wù)的修改,那么第一個事務(wù)兩次讀到的數(shù)據(jù)可能是不一樣的。這就發(fā)生了在一個事務(wù)內(nèi)兩次相同的查詢讀到的數(shù)據(jù)是不一樣的,因此稱為是不可重復(fù)讀。
4.幻讀:例如:目前工資為5000的員工有10人,事務(wù)A讀取所有工資為5000的人數(shù)為10人。此時(shí),事務(wù)B插入了一條工資也為5000的記錄。這時(shí),事務(wù)A再次讀取工資為5000的員工,記錄為11人。此時(shí)就產(chǎn)生了幻讀。
不可重復(fù)讀和幻讀的區(qū)別?不可重復(fù)讀的重點(diǎn)是修改,幻讀的重點(diǎn)在于新增或刪除。
MVCC(多版本并發(fā)控制機(jī)制):InnoDB的MVCC,是通過在每行記錄后面保存兩個隱藏的列來實(shí)現(xiàn)的。分別保存了行的創(chuàng)建時(shí)間和行的刪除時(shí)間(這里存儲的并不是實(shí)際的時(shí)間值,而是系統(tǒng)版本號)。每開始一個新的事務(wù),系統(tǒng)版本號都會自動遞增。事務(wù)開始時(shí)刻的系統(tǒng)版本號會作為事務(wù)的ID,用來和查詢到的每行記錄的版本號進(jìn)行比較,使用MVCC后可重復(fù)讀隔離級別下不會出現(xiàn)幻讀現(xiàn)象。
三、存儲引擎
存儲引擎是數(shù)據(jù)庫底層軟件組織,數(shù)據(jù)庫管理系統(tǒng)(DBMS)使用數(shù)據(jù)引擎進(jìn)行創(chuàng)建、查詢、更新和刪除數(shù)據(jù)。
1、InnoDB(聚集索引方式)
innodb底層存儲結(jié)構(gòu)為B+樹,樹的每個節(jié)點(diǎn)對應(yīng)innodb的一個page,page的大小是固定的,一般設(shè)為16K.其中非葉子節(jié)點(diǎn)只有鍵值,葉子節(jié)點(diǎn)包含完整數(shù)據(jù)。
使用場景:1)經(jīng)常更新的表,是和處理多重并發(fā)的更新請求;
2)支持事務(wù)安全表(ACID),支持行鎖和外鍵;
3)可以通過bin-log日志等恢復(fù)
innodb如果沒有設(shè)置主鍵,就會自動生成一個6字節(jié)的主鍵(用戶不可見)。
2、MyISAM(非聚簇索引方式)
MyISAM在5.1之前是MySQL的默認(rèn)存儲引擎,它強(qiáng)調(diào)的是性能,但是它不支持事務(wù)、也不支持行鎖和外鍵,支持表鎖;當(dāng)插入或更新數(shù)據(jù)時(shí),需要鎖住整個表,效率便會低一些。只緩存索引,不緩存真實(shí)數(shù)據(jù)。MyISAM讀取數(shù)據(jù)時(shí)速度很快,而且不占用大量的內(nèi)存和存儲資源。
MyISAM允許沒有主鍵的存在,是一種靜態(tài)索引結(jié)構(gòu)。
問題:MySQL中MyISAM與InnoDB的區(qū)別?
答:MySQL數(shù)據(jù)庫中,最常用的兩種引擎是innodb和myisam。InnoDB是目前MySQL的默認(rèn)存儲引擎。
1)事務(wù)方面:MyISAM強(qiáng)調(diào)的是性能,查詢速度比InnoDB類型更快,但是不支持事務(wù)。InnoDB提供事務(wù)支持。
2)外鍵:MyISAM不支持外鍵,InnoDB支持外鍵。
3)鎖:MyISAM只支持表級鎖,InnoDB支持行級鎖和表級鎖,默認(rèn)為行級鎖,行鎖大幅度提高了多用戶并發(fā)操作的性能。innodb比較適合于插入和更新操作比較多的情況,而myisam則適合于頻繁查詢的情況。另外,innodb表的行鎖也不是絕對的,如果在執(zhí)行一個SQL語句時(shí),MySQL不能確定要掃描的范圍,innodb同樣會鎖全表,例如:update table set num=1 where name like "%aaa%"。
4)全文索引:MyISAM支持全文索引,Innodb不支持全文索引。innodb從MySQL5.6之后提供全文索引的支持。
5)表主鍵:myisam允許沒有主鍵的表存在;innodb:如果沒有設(shè)定主鍵,就會自動生成一個6字節(jié)的主鍵(用戶不可見)。
6)表的具體行數(shù):myisam:select count(*) from table,myisam只要簡單的讀出保存好的行數(shù)。因?yàn)閙yisam內(nèi)置了一個計(jì)數(shù)器,count(*)時(shí)它直接從計(jì)數(shù)器中讀。
innodb:不保存表的具體行數(shù),也就是說,執(zhí)行select count(*) from table 時(shí),innodb要掃描一遍整個表來計(jì)算有多少行。
以上就是mysql數(shù)據(jù)庫的知識點(diǎn)介紹,看完之后是否有所收獲呢?如果想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊,感謝各位的閱讀。