在創建表時可以指定表的類型,也就是表的存儲引擎。表的存儲引擎決定了數據如何存儲及如何訪問,還有事務如何存儲。表的存儲引擎在很大程度上影響著處理sql語句所需的存儲空間和速度。不同的存儲引擎所具有的特點也有所不同,有些存儲引擎在處理很多復雜的select語句時非常適合,而另一些則在實現快速更新時比較適合。
InnoDB
InnoDB是MySQL的默認事務型引擎,也是最重要,使用最廣泛的存儲引擎。它被設計用來處理大量的短期(short-lived)事務,短期事務大部分情況下是正常提交的,很少會被回滾。InnoDB的性能和自動崩潰恢復特性,使得它在非事務型存儲的需求中也很流行。
除非有非常特別的原因需要使用其他的存儲引擎,否則應該優先考慮InnoDB引擎。————《高性能MySQL》
-
InnoDB采用MVCC來支持高并發,并且實現了四個標準的隔離級別。其默認級別是REPEATABLE READ(可重復讀),并且通過間隙鎖策略防止幻讀的出現。
-
InnoDB表示基于聚簇索引建立的
-
支持外鍵約束。
-
支持自動增加列AUTO_INCREMENT屬性。
-
事務。InnoDB存儲引擎是支持事務的標準MySQL存儲引擎。
-
刪除或增加索引時不需要復制全表數據。
InnoDB內部做了很多優化,包括從磁盤讀取數據時采用的可預測預讀,能夠自動在內存中創建hash索引以加速度操作的自適應哈希索引,以及能夠加速插入操作的插入緩沖區。
InnoDB表是基于聚簇索引建立的。InnoDB的索引結構和MySQL的其他引擎有很大不同,聚簇索引對主鍵查詢有很高的性能。但是二級索引中必須包含主鍵列,所以主鍵列很大的話,其他的所有索引都會很大。因此,若表上的索引較多的話,主鍵應當盡可能的小。
MyISAM
MyISAM提供了大量的特性,包括全文索引,壓縮,空間函數(GIS)等,但MyISAM不支持事務和行級鎖,而且有一個毫無疑問的缺陷就是崩潰后無法安全恢復。在MySQL 5.1及以前的版本中MyISAM為默認的存儲引擎,正是由于該引擎的緣故,即使MySQL支持事務已經很長時間了,在很多人的概念中MySQL還是非事務型的數據庫。
-
MyISAM對整張表加鎖,而不是針對行。
-
支持全文索引。
-
支持壓縮表。壓縮表是不能進行修改的,可以極大地減少磁盤空間占用,因此也可以減少磁盤I/O操作,從而提升查詢性能。
存儲
MyISAM會將表存儲在兩個文件中:數據文件和索引文件,分別以.MYD和.MYI為擴展名。MyISAM表可以包含動態或者靜態行。MySQL會根據表的定義來決定采用何種行格式。
在MySQL5.0中,MyISAM表如果是變長行,則默認配置只能處理256TB的數據
特性
作為MySQL最早的存儲引擎之一,還是有一些特性。
加鎖與并發–表鎖
MyISAM對整張表加鎖,而不是針對行。讀取時會對需要讀到的所有表加共享鎖,寫入時則對表加排他鎖。但是在表有讀取查詢的同時,也可以往表中插入新的記錄(并發插入)。
修復
對于MyISAM表,MySQL可以手工或者自動執行檢查和檢修操作,但這里說的修復和事務恢復以及崩潰恢復是不同的概念。
索引特性
對于MyISAM表,即使是BLOB和TEXT等長字段,也可以基于其前500個字符創建索引。MyISAM也支持全文索引,這是一種基于分詞創建的索引,可以支持復雜的查詢。
延遲更新索引鍵
創建MyISAM表的時候,如果指定了DELAY_KEY_WRITE選項,在每次修改執行完成時,不會立刻將修改的索引數據寫入磁盤。
MyISAM性能
MyISAM引擎設計簡單,數據以緊密格式存儲,所以在某些場景下的性能很好。但由于表鎖的存在對于性能有很大的影響。
Archive 引擎
Archive存儲引擎只支持INSERT和SELECT。Archive引擎會緩存所有的寫并利用zlib對插入進行壓縮,所以比MyISAM表的磁盤I/O更少。但是每次SELECT查詢都需要執行全表掃描。所以Archive表適合日志和數據采集類應用,這類應用做數據分析時往往需要全表掃描。
Archive引擎支持行級鎖和專用的緩沖區,所以可以實現高并發的插入。在一個查詢開始直至返回表中存在的所有的行數之前,Archive會阻止其他的SELECT執行,以實現一致性讀。另外,也實現了批量插入在完成之前對讀操作不可見。這種機制模仿了事務和MVCC的一些特性,但是Archive引擎不是一個事務型的引擎,而是一個針對高速插入和壓縮做了優化的引擎。
CSV存儲引擎
這個引擎可以將普通的CSV文件作為MySQL的表來處理,但這種表不支持索引。只需要將CSV文件copy到CSV存儲引擎的數據目錄下,就能使用在MySQL中已表的規則打開使用。
Memory引擎
如果需要快速地訪問數據,并且這些數據不會被修改,重啟以后丟失也沒有關系,那么使用Memory表是非常有用的。Memory表比MyISAM表要快一個數量級,因為所有數據都保存在內存中,不需要進行磁盤I/O操作。Memory表的結構在重啟以后還會保留,但數據丟失。
-
支持Hash索引,因此查找操作非??臁?/p>
-
是表級鎖,因此并發寫入性能較低。
-
不支持BLOB或TEXT類型的列,并且每行長度是固定的,即使指定了varchar,實際存儲中也會被轉換為char。
說明
除非需要用到某些InnoDB不具備的特性,并且沒有其他辦法可以替代,否則都應該優先選擇InnoDB引擎——《高性能MySQL》
另外上面只是列舉了一些經常遇見的存儲引擎,并不全面。
在創建表時可以指定表的類型,也就是表的存儲引擎。表的存儲引擎決定了數據如何存儲及如何訪問,還有事務如何存儲。表的存儲引擎在很大程度上影響著處理sql語句所需的存儲空間和速度。不同的存儲引擎所具有的特點也有所不同,有些存儲引擎在處理很多復雜的select語句時非常適合,而另一些則在實現快速更新時比較適合。
InnoDB
InnoDB是MySQL的默認事務型引擎,也是最重要,使用最廣泛的存儲引擎。它被設計用來處理大量的短期(short-lived)事務,短期事務大部分情況下是正常提交的,很少會被回滾。InnoDB的性能和自動崩潰恢復特性,使得它在非事務型存儲的需求中也很流行。
除非有非常特別的原因需要使用其他的存儲引擎,否則應該優先考慮InnoDB引擎?!陡咝阅躆ySQL》
-
InnoDB采用MVCC來支持高并發,并且實現了四個標準的隔離級別。其默認級別是REPEATABLE READ(可重復讀),并且通過間隙鎖策略防止幻讀的出現。
-
InnoDB表示基于聚簇索引建立的
-
支持外鍵約束。
-
支持自動增加列AUTO_INCREMENT屬性。
-
事務。InnoDB存儲引擎是支持事務的標準MySQL存儲引擎。
-
刪除或增加索引時不需要復制全表數據。
InnoDB內部做了很多優化,包括從磁盤讀取數據時采用的可預測預讀,能夠自動在內存中創建hash索引以加速度操作的自適應哈希索引,以及能夠加速插入操作的插入緩沖區。
InnoDB表是基于聚簇索引建立的。InnoDB的索引結構和MySQL的其他引擎有很大不同,聚簇索引對主鍵查詢有很高的性能。但是二級索引中必須包含主鍵列,所以主鍵列很大的話,其他的所有索引都會很大。因此,若表上的索引較多的話,主鍵應當盡可能的小。
MyISAM
MyISAM提供了大量的特性,包括全文索引,壓縮,空間函數(GIS)等,但MyISAM不支持事務和行級鎖,而且有一個毫無疑問的缺陷就是崩潰后無法安全恢復。在MySQL 5.1及以前的版本中MyISAM為默認的存儲引擎,正是由于該引擎的緣故,即使MySQL支持事務已經很長時間了,在很多人的概念中MySQL還是非事務型的數據庫。
-
MyISAM對整張表加鎖,而不是針對行。
-
支持全文索引。
-
支持壓縮表。壓縮表是不能進行修改的,可以極大地減少磁盤空間占用,因此也可以減少磁盤I/O操作,從而提升查詢性能。
存儲
MyISAM會將表存儲在兩個文件中:數據文件和索引文件,分別以.MYD和.MYI為擴展名。MyISAM表可以包含動態或者靜態行。MySQL會根據表的定義來決定采用何種行格式。
在MySQL5.0中,MyISAM表如果是變長行,則默認配置只能處理256TB的數據
特性
作為MySQL最早的存儲引擎之一,還是有一些特性。
加鎖與并發–表鎖
MyISAM對整張表加鎖,而不是針對行。讀取時會對需要讀到的所有表加共享鎖,寫入時則對表加排他鎖。但是在表有讀取查詢的同時,也可以往表中插入新的記錄(并發插入)。
修復
對于MyISAM表,MySQL可以手工或者自動執行檢查和檢修操作,但這里說的修復和事務恢復以及崩潰恢復是不同的概念。
索引特性
對于MyISAM表,即使是BLOB和TEXT等長字段,也可以基于其前500個字符創建索引。MyISAM也支持全文索引,這是一種基于分詞創建的索引,可以支持復雜的查詢。
延遲更新索引鍵
創建MyISAM表的時候,如果指定了DELAY_KEY_WRITE選項,在每次修改執行完成時,不會立刻將修改的索引數據寫入磁盤。
MyISAM性能
MyISAM引擎設計簡單,數據以緊密格式存儲,所以在某些場景下的性能很好。但由于表鎖的存在對于性能有很大的影響。
Archive 引擎
Archive存儲引擎只支持INSERT和SELECT。Archive引擎會緩存所有的寫并利用zlib對插入進行壓縮,所以比MyISAM表的磁盤I/O更少。但是每次SELECT查詢都需要執行全表掃描。所以Archive表適合日志和數據采集類應用,這類應用做數據分析時往往需要全表掃描。
Archive引擎支持行級鎖和專用的緩沖區,所以可以實現高并發的插入。在一個查詢開始直至返回表中存在的所有的行數之前,Archive會阻止其他的SELECT執行,以實現一致性讀。另外,也實現了批量插入在完成之前對讀操作不可見。這種機制模仿了事務和MVCC的一些特性,但是Archive引擎不是一個事務型的引擎,而是一個針對高速插入和壓縮做了優化的引擎。
CSV存儲引擎
這個引擎可以將普通的CSV文件作為MySQL的表來處理,但這種表不支持索引。只需要將CSV文件copy到CSV存儲引擎的數據目錄下,就能使用在MySQL中已表的規則打開使用。
Memory引擎
如果需要快速地訪問數據,并且這些數據不會被修改,重啟以后丟失也沒有關系,那么使用Memory表是非常有用的。Memory表比MyISAM表要快一個數量級,因為所有數據都保存在內存中,不需要進行磁盤I/O操作。Memory表的結構在重啟以后還會保留,但數據丟失。
-
支持Hash索引,因此查找操作非???。
-
是表級鎖,因此并發寫入性能較低。
-
不支持BLOB或TEXT類型的列,并且每行長度是固定的,即使指定了varchar,實際存儲中也會被轉換為char。
說明
除非需要用到某些InnoDB不具備的特性,并且沒有其他辦法可以替代,否則都應該優先選擇InnoDB引擎——《高性能MySQL》
另外上面只是列舉了一些經常遇見的存儲引擎,并不全面。
?以上就是【MySQL】MySQL的存儲引擎的內容,更多相關內容請關注PHP中文網(www.php.cn)!