MySQL表類型

來源:互聯網
上載者:User
 MySQL作為當前最為流行的免費資料庫服務引擎,已經風靡了很長一段時間,不過也許也有人對於MySQL的內部環境不很瞭解,尤其那些針對並發性處理的機制。今天,我們先瞭解一下MySQL中資料表的分類,以及它們的一些簡單性質。
截至目前,MySQL一共向使用者提供了包括DBD、HEAP、ISAM、MERGE、MyIAS、InnoDB以及Gemeni這7種表。其中DBD、InnoDB屬於事務安全類表,而其他屬於事務非安全類表。

 
DBD
  Berkeley DB(DBD)表是支援交易處理的表,由Sleepycat軟體公司開發。它提供MySQL使用者期待已久的功能--事務控制。事務控制在任何資料庫系統中都是一個極有價值的功能,因為它們確保一組命令能成功地執行或復原。

HEAP
  HEAP表是MySQL中存取資料最快的表。這是因為他們使用儲存在動態記憶體中的一個散列索引,不過如果MySQL或伺服器崩潰,這些記憶體資料將會丟失。

ISAM
  ISAM表是早期MySQL版本的預設表類型,直到MyIASM開發出來。建議不要再使用它。

MERGE
  MERGE是一個有趣的新類型,在3.23.25之後出現。一個MERGE表實際上是又一個MyISAM表的集合,合并而成的一個表,主要是為了效率的考慮,因為這樣不僅僅可以提高速度、搜尋效率、修複效率而且還節省了磁碟空間。

MyIASM
  MyIASM基於了IASM代碼,應該可以說是IASM的衍生品,不過增加了不少有用的擴充。它是MySQL的預設資料表類型,基於了傳統的ISAM類型,ISAM是Indexed Sequential Access Method(有索引的順序存取方法)的縮寫,一般來說,它是儲存記錄和檔案的標準方法。與其他儲存引擎比較,MyISAM具有檢查和修複表格的大多數工具。ISAM表格可以被壓縮,而且它們支援全文檢索搜尋,不過它們是事務不安全的,而且也不支援外鍵。如果交易回復將會造成不完全復原,從而不具備原子性。所以假如忽略事務以及訪問並發性的話,並且需要執行大量的SELECT檢索語句的話,MyISAM將是最好的選擇。

MyIASM比較好的原因:
  MyIASM表小於IASM表,所以使用較少資源。
  MyIASM表在不同的平台上二進位層可移植。
  MyIASM擁有更大的鍵碼尺寸,更大的鍵碼上限。
  對於MyISAM儲存引擎來說,它的讀鎖和寫鎖是互斥的,從而讀寫操作是串列的。那麼,一個進程請求某個 MyISAM表的讀鎖,同時另一個進程也請求同一表的寫鎖,MySQL如何處理呢?答案是寫進程先獲得鎖。不僅如此,即使讀請求先到鎖等待隊列,寫請求後到,寫鎖也會插到讀鎖請求之前!這是因為MySQL認為寫請求一般比讀請求要重要。這也正是MyISAM表不太適合於有大量更新操作和查詢操作應用的原因,因為,大量的更新操作會造成查詢操作很難獲得讀鎖,從而可能永遠阻塞。這種情況有時可能會變得非常糟糕!幸好我們可以通過一些設定來調節MyISAM 的調度行為。通過指定啟動參數low-priority-updates,使MyISAM引擎預設給予讀請求以優先的權利。通過執行命令SET LOW_PRIORITY_UPDATES=1,使該串連發出的更新要求優先順序降低。通過指定INSERT、UPDATE、DELETE語句的LOW_PRIORITY屬性,降低該語句的優先順序。雖然上面3種方法都是要麼更新優先,要麼查詢優先的方法,但還是可以用其來解決查詢相對重要的應用(如使用者登入系統)中,讀鎖等待嚴重的問題。另外,MySQL也提供了一種折中的辦法來調節讀寫衝突,即給系統參數max_write_lock_count設定一個合適的值,當一個表的讀鎖達到這個值後,MySQL就暫時將寫請求的優先順序降低,給讀進程一定獲得鎖的機會。
上面已經討論了寫優先調度機制帶來的問題和解決辦法。這裡還要強調一點:一些需要長時間啟動並執行查詢操作,也會使寫進程“餓死”!因此,應用中應盡量避免出現長時間啟動並執行查詢操作,不要總想用一條SELECT語句來解決問題,因為這種看似巧妙的SQL語句,往往比較複雜,執行時間較長,在可能的情況下可以通過使用中間表等措施對SQL語句做一定的“分解”,使每一步查詢都能在較短時間完成,從而減少鎖衝突。如果複雜查詢不可避免,應盡量安排在資料庫空閑時段執行,比如一些定期統計可以安排在夜間執行。

InnoDB
  InnoDB是MySQL 4.0之後推出的一種比較新的資料表類型,這種類型是事務安全的。它與BDB類型具有相同的特性,它們還支援外鍵。InnoDB表格速度很快具有比BDB還豐富的特性,因此如果需要一個事務安全的儲存引擎,建議使用它。如果你的資料執行大量的INSERT或UPDATE,出於效能方面的考慮,同樣應該使用InnoDB表。對於支援事務的InnoDB類型的表來說,影響速度的主要原因是AUTOCOMMIT預設設定是開啟的,而且程式沒有顯式調用BEGIN 開始事務,導致每插入一條都自動認可,嚴重影響了速度。可以在執行sql前調用begin,多條sql形成一個事物(即使autocommit開啟也可以),將大大提高效能。

Gemeni
  Gemeni表,據聽說也是在MySQL 4.0之後推出的,不過截至當前,很少有針對它的介紹,同樣應用也就更少了,我們暫時不作介紹。

  MySQL的資料表類型很多,其中比較重要的是MyISAM,InnoDB這兩種。
  這兩種類型各有優缺點,需要根據實際情況選擇適合的,MySQL支援對不同的表設定不同的類型。下面做個簡單的對比:
  MyISAM表類型是一種比較成熟穩定的表類型,但是MyISAM對一些功能不支援。

                      MyISAM                   InnoDB
    事務             不支援                       支援
    資料行鎖定       不支援,只有表鎖定           支援
    外鍵約束         不支援                       支援
    資料表空間大小       相對小                       相對大,最大是2倍
    全文索引         支援                         不支援
    GIS資料          支援                         不支援
    COUNT問題        無      

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.