MySQL存儲引擎
一、MyISAM
1.概要
1.MySQL5.5 之前版本默認存儲引擎
2.多用於系統表和臨時表(在排序、分組等操作中,當數量超過一定的大小後,由查詢優化器建立的臨時表)
3.存儲
MYD:保存表的數據 MYI:保存表的索引文件
2.特性
a).併發性與鎖級別:使用表級鎖而非行級鎖,讀取和寫入互斥,讀寫併發性能比較弱
b).不支持事物、不具備AICD特性:原子性、一致性、分離性、永久性
c).只會緩存索引:通過key_buffer_size
來設置緩存索引,提高訪問性能減少磁盤IO的壓力,但是隻緩存索引,不緩存數據
d).不支持外鍵約束,只支持全文檢索
3.表損壞修復
檢查:
check table tablename
修復:
repair table tablename
通過命令行工具:
myisamchk
,使用時需要停止服務,否則將造成更大的損壞
4.索引類型
1.支持全文索引
2.MySQL 5.7 之前版本唯一原生就支持全文索引的官方存儲引擎
3.支持text
、blog
類型字段建立前 500 個字符的前綴索引
4.支持數據壓縮,使用命令行:myisampack
進行獨立壓縮,讀取單行數據時,不必對整張表進行解壓。
壓縮後只能讀取,不能寫入
5.限制
1.MySQL5.0 版本之前默認表大小爲4G,如存儲大表則要修改MAX_Rows
和 AVG_ROW_LENGTH
2.MYSQL5.0 版本之後默認支持256TB,足夠使用
6.使用場景
1.非事務型應用:數據倉庫、報表
2.只讀類應用
3.空間類應用:GPS
二、InnoDB
1.概要
1.MySQL5.5 及之後版本默認存儲引擎
2.事務型存儲引擎,支持ACID特性,適用於大量小事務
3.使用表空間進行數據存儲
`innodb_file_per_table` ON : 獨立表空間:tablename.ibd OFF : 系統表空間:ibdataX(X爲數字,從1開始)
2.特性
a).InnoDB 是一種事務型存儲引擎
b).完全支持ACID特性
c).Redo Log
:存儲已提交的事務,持久性的體現;Undo Log
:存儲未提交的事務
d).支持行級鎖:可以最大程度的支持併發,由存儲引擎層實現的
鎖?
鎖的主要作用是管理共享資源的併發訪問,實現事務的隔離性
鎖的類型?
共享鎖(讀鎖):相互不會阻塞,多個線程可以同時讀取
獨佔鎖(寫鎖):會阻塞其他的
- 兼容性?
寫鎖 讀鎖 寫鎖 不兼容 不兼容 讀鎖 不兼容 兼容
- 粒度(鎖定對象的最小單位)?
行級鎖
表級鎖
d).狀態檢查
show engine innodb status
:兩次使用間隔 30S 以上,以保證採樣的豐富性
2.表空間的選擇
a).比較
- 系統表空間無法簡單的收縮文件大小
- 獨立表空間可以通過
optimize table
命令收縮系統文件 - 系統表空間會產生IO瓶頸
- 獨立表空間可以同時向多個文件刷新數據
b).建議
- 對InnoDB 使用獨立表空間(MySQL5.6之後獨立表空間爲默認配置)
3.錶轉移的步驟
把原來存在於系統表空間中的錶轉移到獨立的表空間中的方法
步驟:
1.使用
mysqldump
導出所有數據庫表數據2.停止MySQL服務,修改參數,並刪除InnoDB 相關文件(若主從服務架構,先停止從服務器)
3.重啓MySQL服務,重建InnoDB系統表空間
4.重新導入數據
4.使用場景
適用於大多數應用:全文索引、空間函數
三、存儲引擎的選擇(首選InnoDB)
參考條件
- 事務:需要事務InnoDB ,不需要事務MyISAM
- 備份:InnoDB 支持免費熱備方案
- 崩潰恢復:MyISAM損壞概率高於InnoDB,恢復速度MyISAM比InnoDB更慢
- 存儲引擎的特有特性:聚集索引優化-InnoDB;地理空間搜索:5.7之前的版本MyISAM,5.7之後InnoDB
除非萬不得已,否則不要混合使用多種存儲引擎
例如:
1.MyISAM 和InnoDB混合使用時,當事務出現回滾時,只有InnoDB的表中數據可回滾,MyISAM則無法回滾,導致邏輯不完整
2.混合使用多種引擎,無法在線熱備