(5)mysql 經常使用存儲引擎

概述

  mysql5.5以前默認存儲引擎是MyISAM,5.5以後改成InnoDB。若要修改默認引擎,能夠修改配置文件中的default-storage-engine。能夠經過show engines來查看當前數據庫支持的引擎。使用select engine from information_schema.engines where transactions = 'yes';來查看哪些引擎支持事務。在建立表到時候經過engine=...或type=...來指定所要使用到引擎。mysql

MyISAM

  1. 它不支持事務,也不支持外鍵,其優點是訪問的速度快,對事務完整性沒有要求的或者以select/insert爲主的應用基本上可使用這個引擎來建立表。
  2. 每一個MyISAM在磁盤上都有3個文件,其文件名都與表名相同,但擴展名是:
    • .frm(表定義)
    • .MYD(MYDate:存儲數據)
    • .MYI(MYIndex:存儲索引)
  3. .MYD文件和.MYI文件能夠放置在不一樣的目錄中,經過 data directory 和index directory語句指定。
  4. MyISAM類型的表可能會損壞,可使用CHECK TABLE語句來檢查MyISAM表的健康,並用REPAIR TABLE語句修復一個損壞到MyISAM表。
  5. MyISAM支持3種不一樣的存儲格式:sql

    • 靜態(固定長度)表
    • 動態表
    • 壓縮表

      在靜態表中,若是須要保存的內容後面原本就帶有空格,那麼在返回結果的時候會去掉公共的。數據庫

      在動態表中,記錄不固定,優勢是佔用空間相對比較少,缺點是頻繁的更新和刪除記錄會產生碎片,須要按期執行optimize table 來改善性能。安全

      在壓縮表中,由myisampack工具建立,佔據很是小的磁盤空間。由於每一個記錄都被單獨壓縮的。服務器

InnoDB

  1. InnoDB支持事務安全,對比MyISAM引擎,InnoDB寫的效率差一些,而且會佔據更多的磁盤空間。
  2. InnoDB自動增加列能夠手工插入,可是插入的值是空或者0,則實際插入的將是自動增加後的值。可使用last_insert_id()查詢當前線程最後插入記錄使用的值。能夠經過alert table *** auto_increment=n;語句強制設置自動增加值。
  3. 對於InnoDB表,自動增加列必須是索引。若是是組合索引,也必須是組合索引的第一列,可是對於MyISAM表,自動增加列能夠是組合索引的其餘列,這樣插入記錄後,自動增加列是按照組合索引到前面幾列排序後遞增的。
  4. MySQL支持外鍵的存儲引擎只有InnoDB,在建立外鍵的時候,父表必須有對應的索引,子表在建立外鍵的時候也會自動建立對應的索引。在建立索引的時候,能夠指定在刪除、更新父表時,對子表進行的相應操做,包括restrict、cascade、set null和no action。其中restrict和no action相同,是指限制在子表有關聯的狀況下,父表不能更新;casecade表示父表在更新或刪除時,更新或者刪除子表對應的記錄;set null 則表示父表在更新或者刪除的時候,子表對應的字段被set null。當某個表被其它表建立了外鍵參照,那麼該表對應的索引或主鍵被禁止刪除。可使用set foreign_key_checks=0;臨時關閉外鍵約束,set foreign_key_checks=1;打開約束。
  5. InnoDB存儲表和索引有以下兩種方式:
    • 使用共享表空間存儲。
    • 使用多表空間存儲。

MEMORY

  1. memory使用存在內存中的內容來建立表。每一個MEMORY表實際對應一個磁盤文件,格式是.frm。MEMORY類型的表訪問很是快,由於它到數據是放在內存中的,而且默認使用HASH索引,可是一旦服務器關閉,表中的數據就會丟失,但表還會繼續存在。
  2. 每一個MEMORY表中放置到數據量的大小,受到max_heap_table_size系統變量的約束,這個系統變量的初始值是16M,同時在建立MEMORY表時可使用MAX_ROWS子句來指定表中的最大行數。
  3. memory主要用於那些內容變化不頻繁的代碼表,或做爲統計操做的中間結果表。

MERGE

  1. merge存儲引擎是一組MyISAM表的組合,這些MyISAM表結構必須徹底相同,MERGE表中並無數據,對MERGE類型的表能夠進行查詢、更新、刪除的操做,這些操做其實是對內部的MyISAM表進行操做。
  2. 對於對MERGE表進行的插入操做,是根據INSERT_METHOD子句定義的插入的表,能夠有3個不一樣的值,first和last值使得插入操做被相應的做用在第一個或最後一個表上,不定義這個子句或者爲NO,表示不能對這個MERGE表進行插入操做。
  3. 能夠對MERGE表進行drop操做,這個操做只是刪除MERGE表的定義,對內部的表沒有任何影響。
  4. MERGE在磁盤上保留2個以MERGE表名開頭文件:.frm文件存儲表的定義;.MRG文件包含組合表的信息,包括MERGE表由哪些表組成,插入數據時的依據。能夠經過修改.MRG文件來修改MERGE表,可是修改後要經過flush table刷新。
  5. merge表與分區表的區別是:merge表不會智能的將記錄寫到對應的表中,而分區表能夠的。

總結

仍一張表做爲總結:
工具

mysql經常使用存儲引擎
相關文章
相關標籤/搜索