六、資料庫儲存引擎
-- 檢視名命令 SHOW ENGINES; -- 檢視當前的儲存引擎 SHOW VARIABLES LIKE '%storage_engine%'
一、InnoDB儲存引擎
-
-
InnoDB儲存引擎為了在主記憶體中快取資料和索引而維護它自己的緩衝池。InnoDB將它的表和索引存在一個邏輯表中,表空間可以包含數個檔案
-
InnoDB支援外來鍵完整性約束。建立表時,如果沒有顯形在表定義時指定主鍵,InnoDB會為每一行生成一個6B的ROWID,並以此為主鍵。
-
InnoDB不建立目錄,使用InnoDB時,MySql將在MySQL資料目錄下建立一個名為ibdata1
二、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對比
對比項 | MyISAM | InnoDB |
---|---|---|
主外來鍵 | 不支援 | 支援 |
事務 | 不支援 | 支援 |
行表鎖 | 表鎖,即使操作一條記錄也會鎖住整個表,不適合高併發的操作 | 行鎖,操作時只鎖某一行,不對其他行影響,適合高併發 |
快取 | 只快取索引,不快取真實資料 | 不僅快取索引,還快取真實資料, 對記憶體要求極高,而且記憶體大小對效能有決定性影響。 |
表空間 | 小 | 大 |
關注點 | 效能 | 事務 |
預設安裝 | Y | Y |
四、儲存引擎的選擇
-
如果要提供提交、回滾和崩潰恢復能力的事物安全能力,並要求實現併發控制,選擇InnoDB。
-
如果資料表主要用來插入和查詢記錄,則選擇MyISAM。
-
如果存放臨時資料,資料量不大,且對資料安全性要求不高可以選擇將資料儲存在記憶體中的Memory引擎,MySQL中使用該引擎作為臨時表,存放查詢的中間結果。
-
如果只有INSERT和SELECT操作,可以選擇Archive引擎,Archive支援高併發的插入操作,但不是事物安全的,Archive適合儲存歸檔資料如記錄日誌。