MySQL中InnoDB和MyISAM的區(qū)別是什么

今天就跟大家聊聊有關(guān)MySQL 中 InnoDB 和 MyISAM 的區(qū)別是什么,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

創(chuàng)新互聯(lián)建站專注于旺蒼網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供旺蒼營銷型網(wǎng)站建設(shè),旺蒼網(wǎng)站制作、旺蒼網(wǎng)頁設(shè)計、旺蒼網(wǎng)站官網(wǎng)定制、微信小程序定制開發(fā)服務(wù),打造旺蒼網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供旺蒼網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。

InnoDB 和 MyISAM 之間的聯(lián)系和區(qū)別

數(shù)據(jù)庫存儲引擎

數(shù)據(jù)庫存儲引擎是數(shù)據(jù)庫底層軟件組織,數(shù)據(jù)庫管理系統(tǒng)(DBMS)使用數(shù)據(jù)引擎進(jìn)行創(chuàng)建、查詢、更新和刪除數(shù)據(jù)。不同的存儲引擎提供不同的存儲機制、索引技巧、鎖定水平等功能,使用不同的存儲引擎,還可以獲得特定的功能。

如何知道自己的數(shù)據(jù)庫用的什么引擎呢?

SHOW ENGINES;

我們可以看出數(shù)據(jù)庫為我們提供了非常多的存儲引擎,從表中看出,InnoDB 的 Support 列是 DEFAULT,表明在我的數(shù)據(jù)庫服務(wù)器上,InnoDB 是默認(rèn)的數(shù)據(jù)庫引擎,不過 MySQL 對于多引擎有很好的兼容,一個數(shù)據(jù)庫服務(wù)器上不同的數(shù)據(jù)庫完全可以使用不同的數(shù)據(jù)引擎,甚至一個數(shù)據(jù)庫中的多個表也可以使用不同的引擎。

從一些文檔中我們可以總結(jié)出這兩個引擎的一些差異:

InnoDB 支持事務(wù),MyISAM 不支持,對于 InnoDB 每一條 SQL 語句都默認(rèn)封裝成事務(wù)進(jìn)行提交,這樣就會影響速度,優(yōu)化速度的方式是將多條 SQL 語句放在 begin 和 commit 之間,組成一個事務(wù);

InnoDB 支持外鍵,而 MyISAM 不支持。

所以如果一個表修改要求比較高的事務(wù)處理,可以選擇 InnoDB。這個數(shù)據(jù)庫中可以將查詢要求比較高的表選擇 MyISAM 存儲。如果該數(shù)據(jù)庫需要一個用于查詢的臨時表,甚至可以考慮選擇 MEMORY 存儲引擎。

但是為什么 InnoDB 和 MyISAM 之間會有這些差異呢?我們需要了解一下對應(yīng)的儲存引擎的底層原理。

存儲引擎原理

首先針對可能面試會問到的問題「MyISAM 和 InnoDB 兩種引擎所使用的索引的數(shù)據(jù)結(jié)構(gòu)是什么」做一個回答:

都是 B+ 樹,不過區(qū)別在于:

MyISAM 中 B+ 樹的數(shù)據(jù)結(jié)構(gòu)存儲的內(nèi)容是實際數(shù)據(jù)的地址值,它的索引和實際數(shù)據(jù)是分開的,只不過使用索引指向了實際數(shù)據(jù)。這種索引的模式被稱為非聚集索引。

InnoDB 中 B+ 樹的數(shù)據(jù)結(jié)構(gòu)中存儲的都是實際的數(shù)據(jù),這種索引有被稱為聚集索引。

B 樹和 B+ 樹

那么什么是 B+ 樹?

B+ 樹是 B 樹的一個變種,對于 B 樹來說:

B 樹屬于多叉樹又名平衡多路查找樹,其規(guī)則是:

所有節(jié)點關(guān)鍵字是按遞增次序排列,并遵循左小右大原則

子節(jié)點數(shù):非葉節(jié)點的子節(jié)點數(shù)>1,且<=m m="">=2,空樹除外(注:M階代表一個樹節(jié)點最多有多少個查找路徑,M=M 路,當(dāng) M=2 則是 2 叉樹,M=3 則是 3 叉)

關(guān)鍵字?jǐn)?shù):枝節(jié)點的關(guān)鍵字?jǐn)?shù)量大于等于 ceil(m/2)-1 個且小于等于 M-1 個(注:ceil() 是個朝正無窮方向取整的函數(shù) 如 ceil(1.1)結(jié)果為 2)

葉節(jié)點的指針為空且葉節(jié)點具有相同的深度

而對于 B+ 樹:

B+ 樹是 B 樹的一個升級版,相對于 B 樹來說 B+ 樹更充分的利用了節(jié)點的空間,讓查詢速度更加穩(wěn)定,其速度完全接近于二分法查找。

一個 B+ 樹的 C++ 定義類似如下:

class BPTree; //self explanatory classes

class Node

{

bool IS_LEAF;

int *key, size;

Node** ptr;

friend class BPTree;

public:

Node();

};

class BPTree

{

Node *root;

void insertInternal(int,Node*,Node*);

void removeInternal(int,Node*,Node*);

Node* findParent(Node*,Node*);

public:

BPTree();

void search(int);

void insert(int);

void remove(int);

void display(Node*);

Node* getRoot();

void cleanUp(Node*);

~BPTree();

};

什么是索引

由于以上實現(xiàn)的數(shù)據(jù)結(jié)構(gòu)與數(shù)據(jù)庫中索引相關(guān),關(guān)于索引,有以下知識:

唯一索引:唯一索引不允許兩行具有相同的索引值

主鍵索引:為表定義一個主鍵將自動創(chuàng)建主鍵索引,主鍵索引是唯一索引的特殊類型。主鍵索引要求主鍵中的每個值是唯一的,并且不能為空

聚集索引(Clustered):表中各行的物理順序與鍵值的邏輯(索引)順序相同,每個表只能有一個

非聚集索引(Non-clustered):非聚集索引指定表的邏輯順序。數(shù)據(jù)存儲在一個位置,索引存儲在另一個位置,索引中包含指向數(shù)據(jù)存儲位置的指針。可以有多個,小于 249 個

MyISAM

回到 MyISAM,其索引結(jié)構(gòu)如下圖所示,由于 MyISAM 的索引文件僅僅保存數(shù)據(jù)記錄的地址。在 MyISAM 中,主索引和輔助索引(Secondary key)在結(jié)構(gòu)上沒有任何區(qū)別:

MyISAM 中索引檢索的算法為首先按照 B+Tree 搜索算法搜索索引,如果指定的 Key 存在,則取出其 data 域的值,然后以 data 域的值為地址,讀取相應(yīng)數(shù)據(jù)記錄。

InnoDB

對于 InnoDB 來說,表數(shù)據(jù)文件本身就是按 B+Tree 組織的一個索引結(jié)構(gòu),這棵樹的葉節(jié)點 data 域保存了完整的數(shù)據(jù)記錄。

由于 InnoDB 利用的數(shù)據(jù)庫主鍵作為索引 Key,所以 InnoDB 數(shù)據(jù)表文件本身就是主索引,且因為 InnoDB 數(shù)據(jù)文件需要按照主鍵聚集,所以使用 InnoDB 作為數(shù)據(jù)引擎的表需要有個主鍵,如果沒有顯式指定的話 MySQL 會嘗試自動選擇一個可以唯一標(biāo)識數(shù)據(jù)的列作為主鍵,如果無法找到,則會生成一個隱含字段作為主鍵,這個字段長度為6個字節(jié),類型為長整形。

看完上述內(nèi)容,你們對MySQL 中 InnoDB 和 MyISAM 的區(qū)別是什么有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

標(biāo)題名稱:MySQL中InnoDB和MyISAM的區(qū)別是什么
文章路徑:http://bm7419.com/article28/geggjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供動態(tài)網(wǎng)站、營銷型網(wǎng)站建設(shè)App開發(fā)、做網(wǎng)站、響應(yīng)式網(wǎng)站、品牌網(wǎng)站設(shè)計

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)