一文了解Mysql

一文了解Mysql

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只能儲存純文本文件。


分享到:


相關文章: