1. 程式人生 > 資料庫 >高效能MySQL之架構篇

高效能MySQL之架構篇

MySQL伺服器邏輯架構圖:

 

 

一.事務

1.四個特性:原子性(atomicity)、一致性(consistency)、隔離性(isolation)、永續性(durability)。

2.隔離級別

(1)READ UNCOMMITTED(未提交讀)

  事務中的修改,即使沒有提交,對其他事務也都是可見的。事務可以讀取未提交的資料,這也被稱為髒讀。這個級別會導致很多問題,從效能上來說,這個級別不會比其他的級別好太多,但卻缺乏其他級別的很多好處,除非真的有非常必要的理由,在實際應用中一般很少使用。

(2)READ COMMITTED(提交讀)

  一個事務從開始直到提交之前,所做的任何修改對其他事務都是不可見的。

(3)REPEATABLE READ(可重複讀)

  該級別解決了髒讀的問題。該級別保證了在同一個事務中多次讀取同樣記錄的結果是一致的。但理論上,可重複讀隔離級別還是無法解決另外一個幻讀的問題。所謂幻讀,指的是當某個事務在讀取某個範圍的記錄時,另外一個事務又在該範圍內插入了新的記錄,當之前的事務再次讀取該範圍的記錄時,會產生幻行。可重複讀是MySQL的預設事務隔離級別。

(4)SERIALIZABLE(可序列化)

  最高的隔離級別。它通過強制事務序列執行,避免了前面說的幻讀的問題。簡單來說,會在讀取的每一行資料上都加鎖,所以可能導致大量的超時和鎖爭用的問題。實際應用中也很少用到這個隔離級別,只有在非常需要確保資料的一致性而且可以接受沒有併發的情況下,才考慮採用該級別。

 

二.MySQL的儲存引擎

 1.InnoDB儲存引擎

  InnoDB是MySQL的預設事務性引擎,也是最重要、使用最廣泛的儲存引擎。它被設計用來處理大量的短期事務,很少會被回滾。InnoDB的效能和自動崩潰恢復特性,使得它在非事務型儲存的需求中也很流行。

 2.MyISAM儲存引擎

  MyISAM提供了大量的特性,包括全文索引、壓縮、空間函式等,但MyISAM不支援事務和行級鎖,而且有一個毫無疑問的缺陷是崩潰後無法安全恢復。MyISAM對整張表加鎖,而不是針對行。

3.MySQL內建的其他儲存引擎

  Archive引擎:該儲存引擎只支援INSERT和SELECT操作。

  Blackhole引擎:該引擎沒有實現任何的儲存機制,它會丟棄所有插入的資料,不做任何儲存。

  CSV引擎:該引擎可以將普通的CSV檔案作為MySQL的表來處理,但這種表不支援索引。

  Federated引擎:該引擎是訪問其他MySQL伺服器的一個代理,它會建立一個到遠端MySQL伺服器的客戶端連線,並將查詢傳輸到遠端伺服器執行,然後提取或者傳送需要的資料。

  Memory引擎:如果需要快速的訪問資料,並且這些資料不會被修改,重啟後丟失也沒有關係,那麼使用Memory表是非常有用的。

  Merge引擎:Merge表是由多個MyISAM表合併而來的虛擬表。

  NDB叢集引擎:作為SQL和NDB原生協議之間的介面。

4.選擇合適的引擎

  可以簡單地歸納為一句話:“除非需要用到某些InnoDB不具備的特性,並且沒有其他辦法可以替代,否則都應該優先選擇InnoDb引擎。”

5.轉換表的引擎(三種方法)

  (1)ALTER TABLE:ALTER TABLE mytable ENGINE = InnoDB; 這個語法可以使用任何的儲存引擎。但有一個問題:需要執行很長時間。MySQL會按行將資料從原表複製到一張新的表中,在複製期間可能會消耗系統所有的I/O能力,同時原表上會加上讀鎖。可以採用匯入匯出的方法替代。如果轉換表的儲存引擎,將會失去和原引擎相關的所有特性。

  (2)匯出與匯入:可以使用mysqldump工具將資料匯出到檔案,然後修改檔案中的CREATE TABLE語句的儲存引擎選項,注意同時修改表名,因為同一個資料庫中不能存在相同的表名,即使它們使用的是不同的儲存引擎。

  (3)建立與查詢(CREATE和SELECT):這種轉換綜合了第一種方法的高效和第二種方法的安全。不需要匯出整個表的資料,而是先建立一個新的儲存引擎的表,然後利用INSERT...SELECT語法來導資料

 

   資料量不大的話,這樣做工作得很好。如果資料量很大,則可以考慮做分批處理,針對每一段資料執行事務提交操作,以避免大事務產生過多的undo。假設有主鍵欄位id,重複執行以下語句,將資料匯入到新表: