一文了解Mysql

逆月翎發表於2019-10-23

文章原創於公眾號:程式猿周先森。本平臺不定時更新,喜歡我的文章,歡迎關注我的微信公眾號。

file

Redis系列到上一篇已經全部結束了,從本篇開始進入Mysql系列文章專題。本篇作為Mysql系列專題的開篇文章,主要是一文帶大家大致瞭解什麼是Mysql。本篇文章主要涉及的內容有:

  • 什麼是資料庫?
  • 資料庫中的幾個基本術語?
  • Mysql中InnoDB引擎支援的4種事務隔離級別
  • Mysql中如何使用ENUM?
  • Mysql中的儲存引擎
  • mysql中char與varchar的區別?
  • 主鍵和候選鍵的區別?
  • blob和text的區別?
  • Mysql中的鎖
  • 資料庫三正規化

什麼是資料庫?

資料庫其實顧名思義就是儲存資料的倉庫,資料庫可以儲存上億條資料,而資料的來源也很多,比如系統的消費記錄,傳送的訊息記錄等文字型別的資料,當然資料也可以是圖形或者音樂等其他格式的資料。資料庫是按照特定的資料結構來組織,儲存和管理資料的倉庫,實際上資料庫的本質一樣是將資料儲存在磁碟中的本地檔案中,只不過對外提供了API,所以不需要我們編寫運算元據檔案的指令。而關係型資料庫使用最為廣泛的莫過於Oracle、Mysql以及SQL Server。我這裡是以Mysql作為基礎進行講解。

資料庫中的幾個基本術語

  • 資料庫:儲存資料的倉庫,是一些關聯表的集合。
  • 資料表:是資料的矩陣,可以理解為電子表格。
  • 資料表中的列:表示一個屬性,比如使用者名稱。
  • 資料表中的行:表示一行資料,比如使用者表中指定一個使用者的使用者資訊。
  • 主鍵:一個資料表只能夠設定一個主鍵,可以唯一標識一條資料,但是可以多個列組合當成主鍵使用。

InnoDB引擎支援的4種事務隔離級別

InnoDB引擎支援的4種事務隔離級別分別是:讀未提交、讀已提交、可重複讀、序列讀。

  • 讀未提交:允許髒讀,可以讀取其他session中未提交的髒資料。
  • 讀已提交:不可讀取其他session尚未提交的資料,只有其他session資料已提交才能讀取到,為不重複讀。
  • 可重複讀:該級別下可重複讀,InnoDB引擎預設採用可重複讀,不允許讀取還未提交的髒資料,但是可能存在InnoDB獨有的幻讀。
  • 序列讀:該級別下隔離程度最高,事務只能一個接著一個序列執行,無法併發執行。每次序列讀都需要獲得表級共享鎖,讀寫操作都會阻塞。

幻讀

事務在插入一條已經經過檢查不存在的記錄,但是插入結果是資料已經存在,之前的檢查操作如同幻影。Mysql預設採用可重複讀級別,所以只可能出現幻讀的情況。

Mysql中如何使用ENUM?

ENUM是一個字串物件,可以通過ENUM限制欄位的取值範圍。如果插入資料時欄位的取值並非可選值之一,則會空串或者NULL代替使用者想要插入的值。比如使用者性別我們在建表時可以使用ENUM限制取值範圍只能為男或女,但是插入時是保密,這時候因為不輸入性別的取值範圍,所以性別欄位會儲存成空串或者NULL。當然其實很不建議在資料庫使用ENUM限制取值範圍,因為坑其實挺多的,比如ENUM通過角標取值,但是角標從1開始,因為0留給空串了,再或者在ENUM中0和"0"是不一樣的,如果將0當做角標去操作由於ENUM角標從1開始會報錯,如果使用"0"去操作,最後插入的是空串,因為角標0是預留給空串的。所以說在資料庫層次不建議使用ENUM限制欄位取值範圍。

Mysql中的儲存引擎

實際上Mysql支援的儲存引擎很多,Mysql既可以支援NDB和InnoDB這種事務安全表的儲存引擎,也可以支援MyISAM、MEMORY、CSV、BLACKHOLE、FEDERATED等非事務安全表的儲存引擎。在Mysql中主要有四種儲存引擎:InnoDB、MyISAM、MEMORY以及BLACKHOLE。InnoDB:Mysql5.6預設的儲存引擎,支援外來鍵約束和行級鎖。如果資料操作除了插入和查詢之外,還包括很多更新和刪除操作,那麼InnoDB儲存引擎是比較合適的。InnoDB除了有效的降低由刪除和更新導致的鎖定,還可以確保事務的完整提交和回滾。

  • MyISAM:MyISAM不支援事務、外來鍵,但是優勢是訪問速度快,不過由於表級別的鎖定限制了它在讀寫負載方面的效能,因此它經常應用於只讀或者以讀為主的資料場景,並且場景需要對事務的完整性、併發性要求不高。
  • MEMORY:在記憶體中儲存所有資料,Memory訪問資料非常快,因為它的資料是存放在記憶體中的,並且預設使用HASH索引,但是一旦服務關閉,表中的資料就會丟失。
  • BLACKHOLE:黑洞儲存引擎,只接收但卻並不儲存資料。對這種引擎的表的查詢常常返回一個空集。可以應用於主從複製中的分發主庫。

mysql中char與varchar的區別?

  • char:定長,一般用於固定長度的資料儲存。比如手機號。存取效率高。儲存容量最多為255個字元數。
  • varchar:不定長,可以節省空間。varchar需要在資料之前使用一到兩個位元組儲存資料長度。最多情況下可以儲存65532個字元數。

主鍵、超鍵和候選鍵的區別?

  • 主鍵:主鍵剛才其實已經講過了,一個資料表只能夠設定一個主鍵,可以唯一標識一條資料,但是可以多個列組合當成主鍵使用。
  • 超鍵:能唯一標識資料表的都可以作為超鍵。
  • 候選鍵:不含有多餘屬性的超鍵,也就是候選鍵去掉任何一個屬性都不再屬於超鍵。

我們舉個簡單的例子助於理解:

學生表中每個學生都有學號,性別,年齡,姓名,專業。顯而易見的學號是作為主鍵存在的,在學生表中是不允許重複的,{學號},{學號,姓名},{學號,性別},{姓名,專業}這些組合都可以唯一標識一個學生的存在,所以這些組合都可以成為超鍵,但是{學號,姓名},{學號,性別}這兩個組合去掉姓名或者性別只留下一個學號一樣可以標識一個學生的存在,所以這兩個組合不是候選鍵。

Mysql中的鎖

Mysql鎖機制其實相對其他資料庫更為簡單,MyISAM儲存引擎以及MEMORY儲存引擎支援表級鎖,InnoDB儲存引擎支援行級鎖和表級鎖,但是預設情況下是採用行級鎖,也就是我們常說的共享鎖和互斥鎖。從鎖的角度來說,表級鎖適合查詢為主,行級鎖更適合有大量按索引條件併發更新資料。當然最重要的是一定要防止出現死鎖現象。

資料庫三正規化

  • 第一正規化:屬性不可分割。
  • 第二正規化:每個資料表必須擁有主鍵,並且唯一標識整個資料表。
  • 第三正規化:消除資料冗餘,資訊只在一個資料表儲存,不能儲存在多張資料表。然後通過外來鍵進行關聯。

blob和text的區別?

  • text:text是非二進位制字串,並且需要指定字符集,並按照該字符集進行校驗和排序。只能儲存純文字,可以看作是VARCHAR在長度不足時的擴充套件。
  • blob:blob儲存的是二進位制資料,因此無需字符集校驗,blob除了儲存文字資訊外,由於二進位制儲存格式,所以還可以儲存圖片等資訊,blob可以看作是VARBINARY在長度不足時的擴充套件。

相同點

  • 都不允許有預設值。
  • 儲存或檢索資料不刪除尾部空格。
  • 索引在blob或者text上必須執行索引字首的長度。

不同點

  • text大小寫不敏感,而blob排序和比較以大小寫敏感的方式執行。
  • text是非二進位制字串,blob儲存的是二進位制資料。
  • text需要指定字符集,blob無需字符集校驗。
  • blob可以儲存圖片, text只能儲存純文字檔案。

歡迎關注公眾號:程式猿周先森。文章原創於微信公眾號,本平臺不定時更新。

相關文章