數據庫,MySQL這樣存在多存儲引擎的數據庫軟件,清楚常見的存儲引擎的區別,使用合適的存儲引擎,使得項目跑的更順暢,有時候對於一個項目,甚至比項目本身都重要。這篇文章,旨在淺談常見的三種存儲引擎的區別,優缺點。是學習也是分享。
1:查看MySQL所支持的存儲引擎:
1.1 show engines;
1.2 show variables like "have%';
這樣,我們清楚了MySQL所支持的存儲引擎都有哪些。
下面,分析一下幾個常見的存儲引擎。InnoDB,MYISAM和Memory。
2:InnoDB存儲引擎
2.1:InnoDB具有事務,回滾,崩潰修復能力和多版本並發的事務安全
2.2:關於InnoDB的auto_increment列:
2.2.1:InnoDB支持自動增長列,此列不能為空,且值必須唯一
2.2.2:此列必須為主鍵。插入時,不指定值,默認是自增都的值。指定0或者NULL時,也 是自增後的值。指定合法且不存在的值,則此後的自動從該值開始
2.3:InnoDB中的Foreign Key:
InnoDB支持外鍵。外鍵所在表通常稱為子表。所依賴表稱為父表。且父表中,被子表關聯的字段必須為父表的主鍵。
(外鍵:可以簡單的理解為:當對父表的數據進行更新,刪除,添加時,子表的數據也會隨之變化。例子很多,此處不舉例)
2.4:InnoDB的存儲引擎及其優缺點:
InnoDB存儲引擎的存儲格式有三個文件:
.frm表結構文件,此文件存放表創建時的字段定義等信息。
表的數據文件,存放在innodb_data_home_dir目錄下,
表的索引文件,存放在innodb_data_file_path目錄下
InnoDB存儲引擎具有良好的ACID特性。
InnoDB的缺點:讀寫效率相對MYISAM比較差。占用的磁盤空間比較大。
2.5:InnoDB的理想使用場合:
高並發,更新操作比較多的表。需要使用事務的表。對自動災難恢復有要求的表。
3:MYISAM存儲引擎:
3.1:MYISAM存儲引擎表的存儲有三個文件:
.frm文件,存儲表的結構
.myd文件,存儲表的數據
.myi文件,存儲表的索引
3.2:MYISAM存儲引擎的存儲格式
3.2.1:靜態型
表的所有列都是靜態的(定長的)。這種情況下,維護和訪問預定義格式存儲的數據需要的開銷很低。但是,需要的空間會更多,原因是,數據在存儲的時候,使 用每個列的最大空間來存儲,有浪費的空間。當然,磁盤這個都不是問題。
3.2.2:動態型
指標的列中有動態型的列(不定長的)。優點是:使用空間少。缺點是:更新數據時,需要移動數據,產生內部碎片的同時,也降低了維護和訪問的效率。
對於這個問題,我們可以:(1)盡量的使用定長字段(2)使用optimize table語句,整理表中的碎片
3.2.3:壓縮型:
針對應用程序的聲明周期中,只讀的數據表,我們可以通過:myisampack工具轉化為MYISAM壓縮表,以減少使用的磁盤空間
3.4:MYISAM存儲引擎的優缺點:
優點:占用空間小,處理速度快(相對InnoDB來說)
確定:不支持事務的完整性和並發性
4:Memory存儲引擎
4.1:Memory存儲引擎的文件存儲形式
Memory存儲引擎也會再磁盤上形成一個 .frm的表結構文件,只是表的數據件並不以文件的形式存放在磁盤上。鑒於其數據存放在內存裡,因此,訪問速度更快。但需 要考慮的是:內存上數據的持久性。
4.2:Memory存儲引擎的索引類型
默認的是哈希索引,也支持BTree索引
4.3:Memory存儲引擎的數據存儲周期
數據存放在內存上,一旦服務器關機,數據將不再存在
4.4:Memory存儲引擎的優缺點:
Memory存儲引擎不支持變長表列
MySQL4.1.0之前,不支持auto_increment列
4.5:Memory存儲引擎的使用場合
速度要求快的,臨時數據
丟失以後,對項目整體沒有或者負面影響不大的時候。