1. 程式人生 > 實用技巧 >六、資料庫儲存引擎

六、資料庫儲存引擎

-- 檢視名命令
SHOW ENGINES;
-- 檢視當前的儲存引擎
SHOW VARIABLES LIKE '%storage_engine%'

一、InnoDB儲存引擎

  • 具有提交回滾崩潰恢復能力的事務安全(ACID相容)儲存引擎。InnoDB鎖定在行級別。

  • InnoDB儲存引擎為了在主記憶體中快取資料和索引而維護它自己的緩衝池。InnoDB將它的表和索引存在一個邏輯表中,表空間可以包含數個檔案

  • InnoDB支援外來鍵完整性約束。建立表時,如果沒有顯形在表定義時指定主鍵,InnoDB會為每一行生成一個6B的ROWID並以此為主鍵

  • InnoDB不建立目錄,使用InnoDB時,MySql將在MySQL資料目錄下建立一個名為ibdata1

    的10MB大小的自動擴充套件資料檔案,以及兩個名為ib_logfile0和ib_logfile1的5MB大小的日誌檔案

二、MyISAM儲存引擎

2.1、MyISAM的引擎特點

  • 不支援事務

  • 表級鎖定

  • 讀寫相互阻塞

  • 只會快取索引:

  • 讀取速度快,佔用資源相對少

  • 不支援外來鍵約束,但是支援全文索引

2.2、MyISAM引擎的適用的生產場景

  • 不需要支援事務的業務(例如轉賬,付款就不行)

  • 一般為讀資料比較多的應用,讀寫都頻繁則不合適,會堵塞,讀多或者寫多單一性都可以.

  • 讀寫併發訪問較少的業務(單獨讀或者單獨寫高併發可以,同時讀寫併發不行)(主要是鎖定 機制問題,其實鎖定整個表,會有堵塞問題)

  • 資料修改相對較少的業務.

  • 對資料一致性要求不是非常高的業務.

  • 硬體資源較差的機器可以使用MyISAM,一般為中小型網站.

2.3、MyISAM引擎調優精要

  • 設定合適的索引(快取機制).

  • 調整讀寫優先順序,根據實際需求確保重要操作更有限執行.

  • 啟用延時插入(儘量批量插入,降低寫的頻率)

  • 儘量順序操作,讓insert資料都寫入到尾部,減少阻塞.

  • 分解大的時間長的操作,降低單個操作的阻塞時間.

  • 降低併發數(減少對MySQL的訪問),某些高併發的場景可以通過應用進行排隊佇列機制.

  • 對於靜態(更改不頻繁)的資料庫資料,充分利用Query Cache或者memcached快取服務極大可能的提高訪問效率.

  • MyISAM的count只有在全表掃描的時候才是最高效的,帶有條件的count都需要進行試機的資料訪問

  • 也可以在做主從同步的時候主庫使用InnoDB,從庫使用MyISAM,進行讀寫分離(不推薦使用,資料遷移和升級比較麻煩)

  • 使用MyISAM引擎建立資料庫,將生產3個檔案。檔案的名稱以表的名字開始,副檔名支出檔案型別:frm檔案儲存表定義,資料檔案的副檔名為.MYD,索引檔案的副檔名.MYI

三、MyISAM和InnoDB對比

對比項MyISAMInnoDB
主外來鍵 不支援 支援
事務 不支援 支援
行表鎖 表鎖,即使操作一條記錄也會鎖住整個表,不適合高併發的操作 行鎖,操作時只鎖某一行,不對其他行影響,適合高併發
快取 只快取索引,不快取真實資料 不僅快取索引,還快取真實資料, 對記憶體要求極高,而且記憶體大小對效能有決定性影響。
表空間
關注點 效能 事務
預設安裝 Y Y

四、儲存引擎的選擇

  • 如果要提供提交、回滾和崩潰恢復能力的事物安全能力,並要求實現併發控制,選擇InnoDB。

  • 如果資料表主要用來插入和查詢記錄,則選擇MyISAM。

  • 如果存放臨時資料,資料量不大,且對資料安全性要求不高可以選擇將資料儲存在記憶體中的Memory引擎,MySQL中使用該引擎作為臨時表,存放查詢的中間結果。

  • 如果只有INSERT和SELECT操作,可以選擇Archive引擎,Archive支援高併發的插入操作,但不是事物安全的,Archive適合儲存歸檔資料如記錄日誌。