1. 程式人生 > >Mysql三種常見引擎的區別

Mysql三種常見引擎的區別

Mysql資料庫引擎

Mysql常見的三中儲存引擎為InnoDB、MyISAM、MEMORY。其區別提現在事物安全、儲存限制、空間使用、插入資料的速度和對外來鍵的支援上,具體如下:

特性 InnoDB MyISAM MEMORY
事物安全 支援 不支援 不支援
對外建的支援 支援 不支援 不支援
儲存限制 64TB
空間使用
記憶體使用
插入資料的速度

1)事物安全:
InnoDB支援事物安全,MyISAM和MEMORY兩個不支援。

2)對外來鍵的支援:
InnoDB對外來鍵支援情況較好,MyISAM和MEMORY兩個不支援外來鍵。

3)儲存限制:
InnoDB有64TB的儲存限制,MyISAM和MEMORY要是具體情況而定。

4)空間使用:
InnoDB對空間使用程度較高,MyISAM和MEMORY對空間使用程度較低。

5)記憶體使用:
InnoDB和MEMORY對記憶體使用程度較高,MyISAM對記憶體使用程度較低。

6)插入資料的速度:
InnoDB插入資料的速度較低,MyISAM和MEMORY插入資料的速度較高。

Mysql預設儲存引擎

InnoDB是Mysql的預設儲存引擎(Mysql5.5.5之前是MyISAM,可以參看:https://dev.mysql.com/doc/refman/5.5/en/server-options.html#option_mysqld_default-storage-engine)

更改 Mysql 預設引擎為 InnoDB步驟如下:

Mysql預設是關閉InnoDB儲存引擎的使用的,將InnoDB設定為預設的引擎如下。

  1. 檢視Mysql儲存引擎情況: mysql>show engines,結果是: InnoDB | YES,說明此Mysql資料庫伺服器支援InnoDB引擎。

  2. 設定InnoDB為預設引擎:在配置檔案my.ini中的 [mysqld] 下面加入default-storage-engine=INNODB

  3. 重啟Mysql伺服器

  4. 登入Mysql資料庫,mysql>show engines 如果出現 InnoDB |DEFAULT,則表示設定InnoDB為預設引擎成功

Mysql三種引擎的特點

1、InnoDB儲存引擎

InnoDB是事務型資料庫的首選引擎,支援事務安全表(ACID),其它儲存引擎都是非事務安全表,支援行鎖定和外來鍵,MySQL5.5以後預設使用InnoDB儲存引擎。

InnoDB特點: 支援事務處理,支援外來鍵,支援崩潰修復能力和併發控制。如果需要對事務的完整性要求比較高(比如銀行),要求實現併發控制(比如售票),那選擇InnoDB有很大的優勢。

如果需要頻繁的更新、刪除操作的資料庫,也可以選擇InnoDB,因為支援事務的提交(commit)和回滾(rollback)。

2、MyISAM儲存引擎

MyISAM基於ISAM儲存引擎,並對其進行擴充套件。它是在Web、資料倉儲和其他應用環境下最常使用的儲存引擎之一。MyISAM擁有較高的插入、查詢速度,但不支援事務,不支援外來鍵。

MyISAM特點: 插入資料快,空間和記憶體使用比較低。如果表主要是用於插入新記錄和讀出記錄,那麼選擇MyISAM能實現處理高效率。如果應用的完整性、併發性要求比較低,也可以使用

3、MEMORY儲存引擎

MEMORY儲存引擎將表中的資料儲存到記憶體中,為查詢和引用其他表資料提供快速訪問。

MEMORY特點: 所有的資料都在記憶體中,資料的處理速度快,但是安全性不高。如果需要很快的讀寫速度,對資料的安全性要求較低,可以選擇MEMOEY。

它對錶的大小有要求,不能建立太大的表。所以,這類資料庫只使用在相對較小的資料庫表。

對於InnoDB和MyISAM兩個資料庫引擎的選擇:

1)當需要使用資料庫的事務時,InnoDB引擎就是首選。由於鎖的粒度小,寫操作是不會鎖定全表的。所以在併發度較高的場景下使用會提升效率的。

2)大容量的資料集時趨向於選擇Innodb。因為它支援事務處理和故障的恢復。Innodb可以利用資料日誌來進行資料的恢復。主鍵的查詢在Innodb也是比較快的。

3)如果表的讀操作遠遠多於寫操作時,並且不需要事務的支援的。可以將MyIASM作為資料庫引擎的首先。

4)大批量的插入語句時(這裡是INSERT語句)在MyIASM引擎中執行的比較的快,但是UPDATE語句在Innodb下執行的會比較的快,尤其是在併發量大的時候。

InnoDB和MyISAM引擎所使用的索引的資料結構?都是B+樹

對於MyIASM引擎來說,B+樹的資料結構中儲存的內容實際上是實際資料的地址值。也就是說它的索引和實際資料是分開的,只不過使用索引指向了實際資料。這種索引的模式被稱為非聚集索引。

而Innodb引擎的索引的資料結構也是B+樹,只不過資料結構中儲存的都是實際的資料,這種索引有被稱為聚集索引。

Innodb的索引檔案本身就是資料檔案,即B+Tree的資料域儲存的就是實際的資料,這種索引就是聚集索引。這個索引的key就是資料表的主鍵,因此InnoDB表資料檔案本身就是主索引。
因為InnoDB的資料檔案本身要按主鍵聚集,所以InnoDB要求表必須有主鍵(MyISAM可以沒有),如果沒有顯式指定,則MySQL系統會自動選擇一個可以唯一標識資料記錄的列作為主鍵,如果不存在這種列,則MySQL自動為InnoDB表生成一個隱含欄位作為主鍵,這個欄位長度為6個位元組,型別為長整形。
並且和MyISAM不同,InnoDB的輔助索引資料域儲存的也是相應記錄主鍵的值而不是地址,所以當以輔助索引查詢時,會先根據輔助索引找到主鍵,再根據主鍵索引找到實際的資料。所以Innodb不建議使用過長的主鍵,否則會使輔助索引變得過大。建議使用自增的欄位作為主鍵,這樣B+Tree的每一個結點都會被順序的填滿,而不會頻繁的分裂調整,會有效的提升插入資料的效率

擴充套件資料:

mysql其餘不太常見的儲存引擎如下:

1、BDB: 源自Berkeley DB,事務型資料庫的另一種選擇,支援COMMIT和ROLLBACK等其他事務特性

2、Merge :將一定數量的MyISAM表聯合而成一個整體,在超大規模資料儲存時很有用

3、Archive :非常適合儲存大量的獨立的,作為歷史記錄的資料。因為它們不經常被讀取。Archive擁有高效的插入速度,但其對查詢的支援相對較差

4、Federated: 將不同的Mysql伺服器聯合起來,邏輯上組成一個完整的資料庫。非常適合分散式應用

5、Cluster/NDB :高冗餘的儲存引擎,用多臺資料機器聯合提供服務以提高整體效能和安全性。適合資料量大,安全和效能要求高的應用

6、CSV: 邏輯上由逗號分割資料的儲存引擎。它會在資料庫子目錄裡為每個資料表建立一個.CSV檔案。這是一種普通文字檔案,每個資料行佔用一個文字行。CSV儲存引擎不支援索引。

7、BlackHole :黑洞引擎,寫入的任何資料都會消失,一般用於記錄binlog做複製的中繼