mysql常用的儲存引擎及區別

2021-10-22 07:55:39 字數 3490 閱讀 3200

mysql 常見的儲存引擎,可以使用命令:

show

engines

來列出所有的儲存引擎。

儲存引擎是資料庫的核心,在mysql中,儲存引擎是以外掛程式的形式執行的。支援的引擎有十幾種之多,但我們實戰常用到的,大概只有innodb、myisam , memory 和merge等。

為什麼先說innodb?innodb 從 mysql5.5(2023年) 版本代替 myisam 成為預設引擎,可以說只要用過 mysql 的,都用過innodb,相比myisam,強調效能,innodb 側重於提供事務支援以及外來鍵等高階資料庫功能,支援事務,這是mysql預設儲存引擎由myisam變為innodb的主要原因

innodb儲存引擎主要有以下特點:

1、支援事務。預設的事務隔離級別為可重複讀(repeatable-read),通過mvcc(併發版本控制)來實現。

2、使用的鎖粒度預設為行級鎖,可以支援更高的併發;當然,也支援表鎖。

其實有這兩點就足以奠定innodb在儲存引擎中的霸主地位了。你知道的,使用場景真的太多了。

3、支援外來鍵約束;外來鍵約束其實降低了表的查詢速度,但是增加了表之間的耦合度。

4、可以通過自動增長列,方法是auto_increment。

6、在innodb中存在著緩衝管理,通過緩衝池,將索引和資料全部快取起來,加快查詢的速度;

7、對於innodb型別的表,其資料的物理組織形式是聚簇表。所有的資料按照主鍵來組織。資料和索引放在一塊,都位於b+數的葉子節點上;

8、innodb 表的select count() 比 myisam 慢很多;當執行 select count() from table 時,會先把資料讀出來,一行一行的累加,相當於掃瞄全表,最後返回總數量。 是的,真的會很慢。需要注意的是,當count(*) 語句包含 where 條件時,兩種表的操作是一樣的,而myisam有個變數儲存行數,速度相當快。

9、delete from table時,innodb不會重新建立表,而是一行一行的刪除。

innodb的儲存表和索引有下面兩種形式:

共享表空間儲存:所有的表和索引存放在同乙個表空間中。

多表空間儲存:表結構放在.frm檔案,資料和索引放在.ibd檔案中。分割槽表的話,每個分割槽對應單獨的.ibd檔案。使用分割槽表的好處在於提公升查詢效率。

對於innodb來說,最大的優勢在於支援事務,當然這是以犧牲效率為代價的。

二、myisam

1、不支援事務。像是掙脫了枷鎖,在讀寫(insert、select)效率上,要高於innodb不少。場景在:日誌記錄、調查統計表時,絕對值得一用。對了,不支援事務,自然就不支援鎖!

2、體積小,質量大。myisam的索引和資料是分開的,並且索引是有壓縮的,記憶體使用率就對應提高了不少。同時能載入更多索引,而innodb的索引和資料是緊密**的,沒有使用壓縮從而會造成 innodb 比 myisam 資料檔案體積龐大很多。

每張myisam表在磁碟上會對應三個檔案。

(1).frm檔案:儲存表的定義資料

(2).myd檔案:存放表具體記錄的資料

(3).myi檔案:儲存索引

3、從以往經驗來說,select count(*) 和 order by 大概是使用最頻繁的,大概能佔了整個sql總語句的60%以上的操作,而這種操作innodb其實也是會鎖表的,很多人以為innodb是行級鎖,那個只是where對它主鍵是有效,非主鍵的還是會鎖全表的。

4、常常應用部門需要給他們定期某些表的資料,myisam的話很方便,只要發給他們對應那錶的(frm.myd,myi)的檔案,讓他們自己在對應版本的資料庫啟動就行,而innodb就需要匯出.sql了,因為光給別人檔案,受字典資料檔案的影響,對方是無法使用的。

5、如果和 myisam 比 insert 寫操作的話,innodb還達不到myisam的寫效能,如果是針對基於索引的update操作,確實myisam會慢與innodb,但在併發環境下,從庫同步也是個事兒,還不如通過多例項分庫分表架構來解決。

6、myisam表的select count() 是非常快的;在 myisam 儲存引擎中,把錶的總行數(row)儲存在磁碟上,當執行 select count() from t 時,直接返回總資料。同樣,當 count(*) 語句包含 where條件時,兩種表的操作是一樣的。

7、delete from table時,myisam會先將表結構備份到一張虛擬表中,然後執行drop,最後根據備份重建該錶。

你可以將它理解為,臨時表。

沒錯,memory是將資料直接存在記憶體中的,特別適合資料量小的表。同時為了提高資料的訪問速度,每乙個表實際上和乙個磁碟檔案關聯,檔案是frm,速度相當快。

1、支援的資料型別有限制,比如:不支援text和blob型別。對於字串型別的資料,只支援固定長度的行,varchar(64)會被自動儲存為char(64)型別;

2、只支援表級鎖。所以,在訪問量比較大時,表級鎖會成為memory儲存引擎的瓶頸;

3、由於資料是存放在記憶體中,一旦伺服器宕機,資料就會丟失;資料庫主從切換的配置要設定好。

4、查詢的時候,如果有用到臨時表,而且臨時表中有blob,text型別的字段,那麼這個臨時表就會轉化為myisam型別的表,效能會急劇降低;

5、預設使用hash索引。

從字面上理解為,合併,其實就是類似一張檢視表一樣的虛擬表,其實就是將多張一樣表字段的資料合併到一張表中。

例如;order_202103、order_202104兩張訂單表。

create table order_all

(order_id int,

order_no varchar,

money price,

order_time timestamp)

engine = merge union

(order_202103、order_202104)

insert_merthod

=last

default charset = utf8;

意思就是將order_202103、order_202104兩張表中的資料合併到order_all表中,注意insert_merthod = last的意思是,如果在虛擬總表中新增了資料,那麼預設是新增到最後乙個表中,order_202104中也會新增資料。

MySQL 常用資料儲存引擎區別

mysql有多種儲存引擎,目前常用的是 myisam 和 innodb 這兩個引擎,除了這兩個引擎以為還有許多其他引擎,有官方的,也有一些公司自己研發的。這篇文章主要簡單概述一下常用常見的 mysql 引擎,一則這是面試中常被問到的問題,二則這也是資料庫設計中不可忽略的問題,用合適的引擎可以更好的適...

MySQL儲存引擎的區別

mysql常用的儲存引擎有三種 innodb儲存引擎,myisam儲存引擎和memory儲存引擎。每種儲存引擎都有各自的優勢,不能籠統地說誰比誰好,只有適合不適合。三種儲存引擎各自的效能如下 用於事務處理的應用程式,具有眾多特性,包括acid事務支援,支援外來鍵,同時支援崩潰修復能力和併發控制。如果...

MYSQL常用儲存引擎

一 innodb 儲存引擎 innodb 儲存引擎自 mysql 5.5 版本起被指定為預設的儲存引擎,用於完成事務 回滾 崩潰修復和多版本併發控制的事務安全處理。同時也是 mysql中第乙個提供外來鍵約束的表引擎,尤其對事務處理的能力,是 mysql 其他儲存引擎所無法與之比擬的。innodb 的...