欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入MySQL存儲引擎比較的詳解

 更新時間:2013年06月11日 16:37:04   作者:  
本篇文章是對MySQL存儲引擎的比較進行了詳細的分析介紹,需要的朋友參考下
MyISAM是MySQL的默認存儲引擎。MyISAM不支持事務(wù)、也不支持外鍵,但其訪問速度快,對事務(wù)完整性沒有要求。

InnoDB存儲引擎提供了具有提交、回滾和崩潰恢復能力的事務(wù)安全。但是比起MyISAM存儲引擎,InnoDB寫的處理效率差一些并且會占用更多的磁盤空間以保留數(shù)據(jù)和索引。

MEMORY存儲引擎使用存在內(nèi)存中的內(nèi)容來創(chuàng)建表。每個MEMORY表只實際對應一個磁盤文件。MEMORY類型的表訪問非常得快,因為它的數(shù)據(jù)是放在內(nèi)存中的,并且默認使用HASH索引。但是一旦服務(wù)關(guān)閉,表中的數(shù)據(jù)就會丟失掉。

MERGE存儲引擎是一組MyISAM表的組合,這些MyISAM表必須結(jié)構(gòu)完全相同。MERGE表本身沒有數(shù)據(jù),對MERGE類型的表進行查詢、更新、刪除的操作,就是對內(nèi)部的MyISAM表進行的。

MyISAM表還支持3中不同的存儲格式:
1 靜態(tài)表
2 動態(tài)表
3 壓縮表
靜態(tài)表是默認的存儲格式,靜態(tài)表中的字段都是非變長的字段,優(yōu)點是:存儲非常迅速,容易緩存,出現(xiàn)故障容易恢復;缺點是:占用的空間通常比動態(tài)表多。(注意: 在存儲時,列的寬度不足時,用空格補足,當時在訪問的時候并不會得到這些空格)
動態(tài)表的字段是變長的,優(yōu)點是:占用的空間相對較少,但是頻繁地更新刪除記錄會產(chǎn)生碎片,需要定期改善性能,并且出現(xiàn)故障的時候恢復相對比較困難。
壓縮表占用磁盤空間小,每個記錄是被單獨壓縮的,所以只有非常小的訪問開支。

MySQL支持外鍵存儲引擎只有InnoDB,在創(chuàng)建外鍵的時候,要求附表必須有對應的索引,子表在創(chuàng)建外鍵的時候也會自動創(chuàng)建對應的索引。 
InnoDB存儲方式為兩種:1 使用共享表空間存儲 2 使用多表空間 

MEMORY類型的存儲引擎主要用于那些內(nèi)容變化不頻繁的代碼表,或者作為統(tǒng)計操作的中間結(jié)果表,便于高效地堆中間結(jié)果進行分析并得到最終的統(tǒng)計結(jié)果。對MEMORY存儲引擎的表進行更新操作要謹慎,因為數(shù)據(jù)并沒有實際寫入到磁盤中,所以一定要對下次重新啟動服務(wù)后如何獲得這些修改后的數(shù)據(jù)有所考慮。 

MERGE用于將一系列等同的MyISAM表以邏輯方式組合在一起,并作為一個對象引用它。MERGE表的優(yōu)點在于可以突破對單個MyISAM表大小的限制,通過將不同的表分布在多個磁盤上,可以有效的改善MERGE表的訪問效率。 

為了適應各種不同的運行環(huán)境,MYSQL提供了多種不同的存儲引擎(Storage Engine ),在應用程序開發(fā)這個層面上,開發(fā)者可以根據(jù)不同的需求選擇適合的Storage Engine 方案,更為靈活的是,你可以根據(jù)每張表將要存儲數(shù)據(jù)的特點,選擇不同的Storage Engine,也就是說,在一個MYSQL數(shù)據(jù)庫中,可以混合使用多種不同的Storage Engine

首先小瞥一下MySQL的體系結(jié)構(gòu),在最高抽象層度下,可以用Garlan & Shaw的分層結(jié)構(gòu)體系來表示(左)
 
其中應用層為所有RDBMS用戶提供用戶接口,邏輯層包括了所有核心功能的實現(xiàn),物理層則負責將數(shù)據(jù)存儲在硬件設(shè)備上。

圖中右側(cè)更為具體的描述了邏輯層的組成,查詢處理子系統(tǒng)、事務(wù)管理子系統(tǒng)、恢復管理子系統(tǒng)和存儲管理子系統(tǒng)共同組成了MySQL的邏輯層。相信Storage Engine的位置是在Storage Management處,既Storage Engine屬于Storage Management子系統(tǒng)的一部分

為了讓思路更清晰一些,下面給出一幅比較全面的體系結(jié)構(gòu)圖(或更確切的說是流程圖,只是忽略了反饋)
 
上面三幅圖來自于一篇非官方(不保證百分百的正確)的MySQL體系結(jié)構(gòu)的報告,與《High Performance MySQL》一書中給出的MySQL大體結(jié)構(gòu)(下圖,基本對應于Logic Layer,從第一幅圖右側(cè)可以看出MySQL logic layer同樣遵從分層體系結(jié)構(gòu))還是比較吻合的。
 
連接上圖中第二層和第三層之間的接口是并不針對任何存儲引擎的單一API,.大概由20個基本的類似“啟動事務(wù),返回結(jié)果集”等函數(shù)組成。存儲引擎并不處理SQL,相互之間也不通信,它們的任務(wù)只是簡單的響應高層傳來的請求。

存儲引擎各自的一些特點 

上面提到的四種存儲引擎都有各自適用的環(huán)境,這取決于它們獨有的一些特征。主要體現(xiàn)在性能、事務(wù)、并發(fā)控制、參照完整性、緩存、 故障恢復,備份及回存等幾個方面


目前比較普及的存儲引擎是MyISAM和InnoDB.而MyISAM又是絕大部分Web應用的首選。MyISAM與InnoDB的主要的不同點在于性能和事務(wù)控制上。

MyISAM是早期ISAM(Indexed Sequential Access Method,我現(xiàn)在用的MySQL5.0已經(jīng)不支持ISAM了)的擴展實現(xiàn),ISAM被設(shè)計為適合處理讀頻率遠大于寫頻率這樣一種情況,因此ISAM以及后來的MyISAM都沒有考慮對事物的支持,排除了TPM,不需要事務(wù)記錄,ISAM的查詢效率相當可觀,而且內(nèi)存占用很少。MyISAM在繼承了這類優(yōu)點的同時,與時俱進的提供了大量實用的新特性和相關(guān)工具。例如考慮到并發(fā)控制,提供了表級鎖,雖然MyISAM本身不支持容錯,但可以通過myisamchk進行故障恢復。而且由于MyISAM是每張表使用各自獨立的存儲文件(MYD數(shù)據(jù)文件和MYI索引文件),使得備份及恢復十分方便(拷貝覆蓋即可),而且還支持在線恢復。

所以如果你的應用是不需要事務(wù),處理的只是基本的CRUD操作,那么MyISAM是不二選擇

InnoDB被設(shè)計成適用于高并發(fā)讀寫的情況.使用MVCC(Multi-Version Concurrency Control)以及行級鎖來提供遵從ACID的事務(wù)支持。InnoDB支持外鍵參照完整性,具備故障恢復能力。另外 InnoDB的性能其實還是不錯的,特別是在處理大數(shù)據(jù)量的情況下,用官方的話說就是: InnoDB的CPU效率是其他基于磁盤的關(guān)系數(shù)據(jù)庫存儲引擎所不能比的。不過InnoDB的備份恢復要麻煩一點,除非你使用了4.1以后版本提供的Mulit-tablespace支持,因為InnoDB和MyISAM不同,他的數(shù)據(jù)文件并不是獨立對應于每張表的。而是使用的共享表空間,簡單的拷貝覆蓋方法對他不適用,必須在停掉MYSQL后對進行數(shù)據(jù)恢復。使用Per-Table Tablespacesd,使其每張表對應一個獨立的表空間文件,則情況要簡單很多。

一般來說,如果需要事務(wù)支持,并且有較高的并發(fā)讀寫頻率,InnoDB是不錯的選擇。要是并發(fā)讀寫頻率不高的話,其實可以考慮BDB,但由于在MySQL5.1及其以后版本中,將不再提供BDB支持。這個選項也就沒有了

至于Heap和BDB(Berkeley DB),相對來說,普及率不如前兩種,但在有些情況下,還是挺適用的

Heap存儲引擎就是將數(shù)據(jù)存儲在內(nèi)存中,由于沒有磁盤I./O的等待,速度極快。但由于是內(nèi)存存儲引擎,所做的任何修改在服務(wù)器重啟后都將消失。

Heap挺適合做測試的時候使用

BDB是MySQL第一款事務(wù)安全的存儲引擎。在Berkeley DB database library的基礎(chǔ)上建立,同樣是事務(wù)安全的,但BDB的普及率顯然不及InnoDB,因為大多數(shù)在MySQL中尋找支持事務(wù)的存儲引擎的同時也在找支持MVCC或是行級鎖定存儲引擎,而BDB只支持Page-level Lock。

 

 

附上一張《High Performance MySQL》 中的各存儲引擎的特性表

Attribute

MyISAM

Heap

BDB

InnoDB

Transactions

No

No

Yes

Yes

Lock granularity

Table

Table

Page (8 KB)

Row

Storage

Split files

In-memory

Single file per table

Tablespace(s)

Isolation levels

None

None

Read committed

All

Portable format

Yes

N/A

No

Yes

Referential integrity

No

No

No

Yes

Primary key with data

No

No

Yes

Yes

MySQL caches data records

No

Yes

Yes

Yes

Availability

All versions

All versions

MySQL-Max

All Versions

相關(guān)文章

  • 基于MYSQL中優(yōu)化的一些方法

    基于MYSQL中優(yōu)化的一些方法

    本篇文章是對MYSQL中優(yōu)化的一些方法進行了詳細的介紹,需要的朋友參考下
    2013-05-05
  • Linux中安裝MySql 5.7.21的詳細操作步驟

    Linux中安裝MySql 5.7.21的詳細操作步驟

    這篇文章主要給大家介紹了關(guān)于在Linux中安裝MySql 5.7.21的詳細操作步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-01-01
  • MariaDB(Mysql分支)my.cnf配置文件中文注釋版

    MariaDB(Mysql分支)my.cnf配置文件中文注釋版

    這篇文章主要介紹了MariaDB my.cnf配置文件中文注釋版,MariaDB是Mysql的一個分支,完全兼容Mysql,需要的朋友可以參考下
    2014-06-06
  • 與MSSQL對比學習MYSQL的心得(二)--顯示寬度

    與MSSQL對比學習MYSQL的心得(二)--顯示寬度

    MYSQL中的整數(shù)型數(shù)據(jù)類型都可以指定顯示寬度,而SQLSERVER不行
    2014-06-06
  • 詳解mysql索引總結(jié)----mysql索引類型以及創(chuàng)建

    詳解mysql索引總結(jié)----mysql索引類型以及創(chuàng)建

    索引是一種特殊的文件(InnoDB數(shù)據(jù)表上的索引是表空間的一個組成部分),它們包含著對數(shù)據(jù)表里所有記錄的引用指針。這篇文章主要介紹了詳解mysql索引總結(jié)----mysql索引類型以及創(chuàng)建,有興趣的可以了解一下。
    2016-11-11
  • MySQL學習教程之聚簇索引

    MySQL學習教程之聚簇索引

    這篇文章主要給大家介紹了關(guān)于MySQL學習教程之聚簇索引的相關(guān)資料,文中通過圖文介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • 最新評論