MySQL常見的存儲引擎InnoDB、MyISAM有何區別?
大家好,我是阿秀。
我來更新了,本期是 MySQL 第二期,至此 MySQL 部分就全部更新完畢了,下一彈就是 Redis 篇了。
上一篇文章中,小伙伴建議將資料按照更細粒度去整理一番,我覺得是非常不錯的建議。目前正在整理中,等全部整理完畢就會更新第四版的 PDF 版本了,第三版的 PDF 直接回復關鍵字 「PDF」 就可以下載了。
話不多說,那我們就開始本期內容吧。
26、數據庫三大范式精講第一范式
在任何一個關系數據庫中,第一范式(1NF)是對關系模式的基本要求,不滿足第一范式(1NF)的數據庫就不是關系數據庫。所謂第一范式(1NF)是指數據庫表的每一列都是不可分割的基本數據項,同一列中不能有多個值,即實體中的某個屬性不能有多個值或者不能有重復的屬性。
如果出現重復的屬性,就可能需要定義一個新的實體,新的實體由重復的屬性構成,新實體與原實體之間為一對多關系。在第一范式(1NF)中表的每一行只包含一個實例的信息。
簡而言之,第一范式就是無重復的列。
第二范式
第二范式(2NF)是在第一范式(1NF)的基礎上建立起來的,即滿足第二范式(2NF)必須先滿足第一范式(1NF)。第二范式(2NF)要求數據庫表中的每個實例或行必須可以被惟一地區分。
為實現區分通常需要為表加上一個列,以存儲各個實例的惟一標識。這個惟一屬性列被稱為主關鍵字或主鍵、主碼。第二范式(2NF)要求實體的屬性完全依賴于主關鍵字。
所謂完全依賴是指不能存在僅依賴主關鍵字一部分的屬性,如果存在,那么這個屬性和主關鍵字的這一部分應該分離出來形成一個新的實體,新實體與原實體之間是一對多的關系。為實現區分通常需要為表加上一個列,以存儲各個實例的惟一標識。
簡而言之,第二范式就是非主屬性非部分依賴于主關鍵字。
第三范式
滿足第三范式(3NF)必須先滿足第二范式(2NF)。簡而言之,第三范式(3NF)要求一個數據庫表中不包含已在其它表中已包含的非主關鍵字信息。
例如,存在一個部門信息表,其中每個部門有部門編號(dept_id)、部門名稱、部門簡介等信息。那么在員工信息表中列出部門編號后就不能再將部門名稱、部門簡介等與部門有關的信息再加入員工信息表中。如果不存在部門信息表,則根據第三范式(3NF)也應該構建它,否則就會有大量的數據冗余。
簡而言之,第三范式就是屬性不依賴于其它非主屬性。
27、數據庫三大范式精要總結
(1)簡單歸納:
第一范式(1NF):字段不可分;
第二范式(2NF):有主鍵,非主鍵字段依賴主鍵;
第三范式(3NF):非主鍵字段不能相互依賴。
(2)解釋:
1NF:原子性。字段不可再分,否則就不是關系數據庫;;
2NF:唯一性 。一個表只說明一個事物;
3NF:每列都與主鍵有直接關系,不存在傳遞依賴。
28、MySQL常見的存儲引擎InnoDB、MyISAM的區別?適用場景分別是?
1)事務:MyISAM不支持,InnoDB支持
2)鎖級別:MyISAM 表級鎖,InnoDB 行級鎖及外鍵約束
3)MyISAM存儲表的總行數;InnoDB不存儲總行數;
4)MyISAM采用非聚集索引,B+樹葉子存儲指向數據文件的指針。InnoDB主鍵索引采用聚集索引,B+樹葉子存儲數據
適用場景:
MyISAM適合:插入不頻繁,查詢非常頻繁,如果執行大量的SELECT,MyISAM是更好的選擇, 沒有事務。
InnoDB適合:可靠性要求比較高,或者要求事務;表更新和查詢都相當的頻繁, 大量的INSERT或UPDATE
29、事務四大特性(ACID)原子性、一致性、隔離性、持久性?
第一種回答
原子性:一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結束在中間某個環節。。事務在執行過程中發生錯誤,會被恢復(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。一致性:在事務開始之前和事務結束以后,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及后續數據庫可以自發性地完成預定的工作。隔離性:數據庫允許多個并發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務并發執行時由于交叉執行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)。持久性:事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失。
第二種回答
原子性(Atomicity)
原子性是指事務包含的所有操作要么全部成功,要么全部失敗回滾,因此事務的操作如果成功就必須要完全應用到數據庫,如果操作失敗則不能對數據庫有任何影響。
一致性(Consistency)
事務開始前和結束后,數據庫的完整性約束沒有被破壞。比如A向B轉賬,不可能A扣了錢,B卻沒收到。
隔離性(Isolation)
隔離性是當多個用戶并發訪問數據庫時,比如操作同一張表時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個并發事務之間要相互隔離。
同一時間,只允許一個事務請求同一數據,不同的事務之間彼此沒有任何干擾。比如A正在從一張銀行卡中取錢,在A取錢的過程結束前,B不能向這張卡轉賬。關于事務的隔離性數據庫提供了多種隔離級別,稍后會介紹到。?
持久性(Durability)
持久性是指一個事務一旦被提交了,那么對數據庫中的數據的改變就是永久性的,即便是在數據庫系統遇到故障的情況下也不會丟失提交事務的操作。
30、SQL中的NOW()和CURRENT_DATE()兩個函數有什么區別?
NOW()命令用于顯示當前年份,月份,日期,小時,分鐘和秒。CURRENT_DATE()僅顯示當前年份,月份和日期。
31、什么是聚合索引 ?
聚簇索引就是按照拼音查詢,非聚簇索引就是按照偏旁等來進行查詢。
其實,我們的漢語字典的正文本身就是一個聚集索引。比如,我們要查"安"字,就會很自然地翻開字典的前幾頁,因為"安"的拼音是"an",而按照拼音排序 漢字的字典是以英文字母"a"開頭并以"z"結尾的,那么"安"字就自然地排在字典的前部。如果您翻完了所有以"a"開頭的部分仍然找不到這個字,那么就 說明您的字典中沒有這個字;同樣的,如果查"張"字,那您也會將您的字典翻到最后部分,因為"張"的拼音是"zhang"。也就是說,字典的正文部分本身 就是一個目錄,您不需要再去查其他目錄來找到您需要找的內容。
我們把這種正文內容本身就是一種按照一定規則排列的目錄稱為"聚集索引"
32、什么是非聚合索引?
如果您認識某個字,您可以快速地從自動中查到這個字。但您也可能會遇到您不認識的字,不知道它的發音,這時候,您就不能按照剛才的方法找到您要查的字,而 需要去根據"偏旁部首"查到您要找的字,然后根據這個字后的頁碼直接翻到某頁來找到您要找的字。
但您結合"部首目錄"和"檢字表"而查到的字的排序并不是 真正的正文的排序方法,比如您查"張"字,我們可以看到在查部首之后的檢字表中"張"的頁碼是672頁,檢字表中"張"的上面是"馳"字,但頁碼卻是63 頁,"張"的下面是"弩"字,頁面是390頁。
很顯然,這些字并不是真正的分別位于"張"字的上下方,現在您看到的連續的"馳、張、弩"三字實際上就是他 們在非聚集索引中的排序,是字典正文中的字在非聚集索引中的映射。
我們可以通過這種方式來找到您所需要的字,但它需要兩個過程,先找到目錄中的結果,然后 再翻到您所需要的頁碼。
我們把這種目錄純粹是目錄,正文純粹是正文的排序方式稱為"非聚集索引"。
33、聚集索引與非聚集索引的區別是什么?
非聚集索引和聚集索引的區別在于, 通過聚集索引可以查到需要查找的數據, 而通過非聚集索引可以查到記錄對應的主鍵值 , 再使用主鍵的值通過聚集索引查找到需要的數據。聚集索引和非聚集索引的根本區別是表記錄的排列順序和與索引的排列順序是否一致。
聚集索引(Innodb)的葉節點就是數據節點,而非聚集索引(MyisAM)的葉節點仍然是索引節點,只不過其包含一個指向對應數據塊的指針。
請輸入評論內容...
請輸入評論/評論長度6~500個字
最新活動更多
-
11月7日立即參評>> 【評選】維科杯·OFweek 2025(第十屆)物聯網行業年度評選
-
11月20日立即報名>> 【免費下載】RISC-V芯片發展現狀與測試挑戰-白皮書
-
即日-11.25立即下載>>> 費斯托白皮書《柔性:汽車生產未來的關鍵》
-
11月27日立即報名>> 【工程師系列】汽車電子技術在線大會
-
11月28日立即下載>> 【白皮書】精準洞察 無線掌控——283FC智能自檢萬用表
-
12月18日立即報名>> 【線下會議】OFweek 2025(第十屆)物聯網產業大會


分享













