【數據庫】存儲引擎

(一)概念

       MySQL中的數據用各種不同的技術存儲在文件(或者內存)中。每一種技術都使用不同的存儲機制、索引技巧、鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。例如,你在研究大量的臨時數據,你也許需要使用內存MySQL存儲引擎。內存存儲引擎能夠在內存中存儲所有的表格數據。又或者,你也許需要一個支持事務處理的數據庫(以確保事務處理不成功時數據的回退能力)。

       這些不同的技術以及配套的相關功能在 MySQL中被稱作存儲引擎(也稱作表類型)。 MySQL默認配置了許多不同的存儲引擎,可以預先設置或者在MySQL服務器中啓用。你可以選擇適用於服務器、數據庫和表格的存儲引擎,以便在選擇如何存儲你的信息、如何檢索這些信息以及你需要你的數據結合什麼性能和功能的時候爲你提供最大的靈活性。

       關係數據庫表是用於存儲和組織信息的數據結構,可以將表理解爲由行和列組成的表格,類似於Excel的電子表格的形式。有的表簡單,有的表複雜,有的表根本不用來存儲任何長期的數據,有的表讀取時非常快,但是插入數據時去很差;而我們在實際開發過程中,就可能需要各種各樣的表,不同的表,就意味着存儲不同類型的數據,數據的處理上也會存在着差異,那麼。對於MySQL來說,它提供了很多種類型的存儲引擎(或者說不通的表類型),我們可以根據對數據處理的需求,選擇不同的存儲引擎,從而最大限度的利用MySQL強大的功能。

(二)分類

   2.1 MyISAM

        MYISAM強調的是快速讀取操作,而且不佔用大量的內存和存儲資源不支持事務處理和外鍵,支持全文索引和表鎖,底層爲B+tree,採取非聚集索引,數據存儲在磁盤上;

   2.2 InnoDB

         支持外鍵、事務和行鎖,不支持全文索引,底層爲B+tree,採取聚集索引,數據存放在磁盤上;

   2.3 MEMORY

          適用於臨時數據的存儲爲了提高效率會將varchar當成char處理、不支持 圖片[BLOB]和大文本[TEXT]存儲、底層爲hash、存儲在內存上,但當MEMORY中出現BLOB或者TEXT會將內容轉存到磁盤上存儲

   2.4 ARCHIVE

        一般存儲日誌數據使用壓縮算法將數據進行壓縮後存儲,壓縮比例一般是1:10,只支持insert和select操作不支持索引;

總結如下圖所示:

               

(三)InnoDB與MyISAM的區別

   3.1 事務的概念

       A  -> 原子性(Atomicity)指一個事務要麼全部執行,要麼不執行;也就是說一個事務不可能只執行了一半就停止了.比如你從取款機取錢,這個事務可以分成兩個步驟:1劃卡,2出錢.不可能劃了卡,而錢卻沒出來.這兩步必須同時完成.要麼就不完成.

       C  -> 一致性(Consistency)指事務的運行並不改變數據庫中數據的一致性.例如,完整性約束了a+b=10,一個事務改變了a,那麼b也應該隨之改變.

       I   ->  獨立性(Isolation):事務的獨立性也有稱作隔離性,是指兩個以上的事務不會出現交錯執行的狀態.因爲這樣可能會導致數據不一致.

       D  ->  持久性(Durability)事務的持久性是指事務執行成功以後,該事務所對數據庫所作的更改便是持久的保存在數據庫之中,不會無緣無故的回滾.

   3.2 MyISAM

     MyIASM是MySQL默認的引擎,但是它沒有提供對數據庫事務的支持,也不支持行級鎖和外鍵,因此當INSERT(插入)或UPDATE(更新)數據時即寫操作需要鎖定整個表,效率便會低一些。不過和Innodb不同,MyIASM中存儲了表的行數,於是SELECT COUNT(*) FROM TABLE時只需要直接讀取已經保存好的值而不需要進行全表掃描。如果表的讀操作遠遠多於寫操作且不需要數據庫事務的支持,那麼MyIASM也是很好的選擇。

   3.3 InnoDB

        Innodb引擎提供了對數據庫ACID事務的支持;該引擎還提供了行級鎖和外鍵約束它的設計目標是處理大容量數據庫系統;MySQL運行時Innodb會在內存中建立緩衝池,用於緩衝數據和索引。當需要使用數據庫事務時,該引擎當然是首選。由於鎖的粒度更小,寫操作不會鎖定全表,所以在併發較高時,使用Innodb引擎會提升效率但是使用行級鎖也不是絕對的,如果在執行一個SQL語句時MySQL不能確定要掃描的範圍,InnoDB表同樣會鎖全表。

   3.4 兩種存儲引擎的選擇

       大數據集趨向於選擇InnoDB引擎,因爲它支持事務處理和故障恢復。數據庫的大小決定了故障恢復的時間長短,InnoDB可以利用事務日誌進行數據恢復,這會比較快。主鍵查詢在InnoDB引擎下也會相當快,不過需要注意的是如果主鍵太長也會導致性能問題;大批的INSERT語句(在每個INSERT語句中寫入多行,批量插入)在MyISAM下會快一些,但是UPDATE語句在InnoDB下則會更快一些,尤其是在併發量大的時候。

(四)更改數據庫引擎

   4.1 查看當前數據庫支持的引擎和默認的數據庫引擎

    命令:

show engines;

    結果:

   

 4.2 更改數據庫引擎

     方法1:修改配置文件my.ini 

     將my-small.ini另存爲my.ini,在[mysqld]後面添加default-storage-engine=InnoDB,重啓服務,數據庫默認的引擎修改爲InnoDB

     方法2:在建表的時候指定

create table mytbl(   
    id int primary key,   
    name varchar(50)   
)type=MyISAM;

     方法3:建表後更改

 alter table mytbl2 type = InnoDB;

  4.3 查看修改結果

      方法1:

show table status from mytest; 

     方法2:

show create table table_name;

參考文章:https://www.cnblogs.com/0201zcr/p/5296843.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章