MySQL InnoDB與MyISAM儲存引擎差異

2022-01-15 17:53:11 字數 3511 閱讀 7536

言:

之前簡單介紹過 mysql 常用的儲存引擎,今天對兩個主流的儲存簡單分析下差異,書上沒有參考的筆試題解答註解;

差異:myisam 只支援表鎖,不支援事務,表損壞率較高。較老的儲存引擎。

它分為2種型別的檔案:以 myd 作為字尾名的資料檔案和以 myi 作為字尾名的索引檔案。

myisam 讀寫併發不如 innodb,適用於insert較多的場景,且支援直接複製檔案,用以備份資料,

是 mysql 公司開發的,物理檔案主要有資料檔案,日誌檔案和索引檔案,並且這三個檔案是單獨存在。

innodb 支援行鎖,支援事務,支援行級鎖,crash(崩潰)後具有 revcover(還原)機制,

只有 ibd 檔案,分為資料區和索引區,有較好的讀寫併發能力,但做 count 運算時相當消耗cpu,

是 innodb 公司開發的。物理檔案有日誌檔案,資料檔案和索引檔案。

其中,索引檔案和資料檔案是放在乙個目錄下,可以設定共享檔案、獨享檔案兩種格式。

ps:help_topic myisam 表、innerdb innodb 表;

myisam

innodb

構成上的區別

每個myisam

在磁碟上儲存成三個檔案。

每乙個檔案的名字就是表的名字,檔名都和表名相同,

副檔名指出檔案型別。

表定義的擴充套件名為.frm

(frame

,儲存表定義);

資料檔案的擴充套件名為.myd

(mydata

,儲存資料);

索引檔案的副檔名是.myi

(myindex

,儲存索引);

資料檔案和索引檔案可以放置在不同的目錄下,

平均分布i/o

,獲得更快的速度。

只有ibd

檔案,分為資料區和索引區,有較好的讀寫併發能力。

物理檔案有:日誌檔案、資料檔案和索引檔案。

其中,索引檔案和資料檔案是放在乙個目錄下,可以設定共享檔案與獨享檔案兩種格式。

基於磁碟的資源是 

innodb 

表空間資料檔案和它的日誌檔案,

innodb 

表的大小只受限於作業系統檔案的大小,一般為

2gb(單個檔案)

。innodb 

儲存引擎提供了具有提交、回滾和崩潰恢復能力的事務安全。

但是對比 

myisam 

的儲存引擎,

innodb 

寫的處理效率差一些,

並且會占用更多的磁碟空間以保留資料和索引。

事務處理上方面

myisam型別的表強調的是效能,其執行速度比

innodb

型別更快,

但是不提供事務支援。

innodb提供事務支援事務、外來鍵等高階資料庫功能。

select

update

insert

delete

如果執行大量的 select

,那麼 

myisam 

是更好的選擇。

(1)如果執行大量的

insert

或update

,那麼出於效能方面的考慮,應該使用

innodb

表。(2

)當執行

delete from table

時,innodb

不會重建表,而是一行一行地刪除。(3)

load table from master 

操作對 

innodb 

是不起作用的,

解決方法是首先把 

innodb 

表改成 

myisam 

表,匯入資料後再改成 

innodb 

表,但是對於使用的額外的 

innodb 

特性(例如外來鍵)的表不適用。

清空表

myisam 會重建表。

innodb 是一行一行地刪除,效率非常慢。

對auto_increment

列的操作

myisam 為 

insert 

和 update 

操作自動更新這一列。

auto_increment 

值可用 

alter table 

來重置。

對於auto_increment

型別的字段,

innodb

中必須包含只有該字段的索引,但是在

myisam

表中,可以和其它字段一起建立聯合索引。

如果為乙個表指定auto_increment

列,那麼在資料字典裡的

innodb

表控制代碼包含乙個名為自動增長計數器的計數器,

它被用在為該列賦新值,自動增長計數器僅被儲存在主記憶體中,而不是存在磁碟上。

innodb

中必須包含只有該字段的索引。

表的行數

當執行sql

語句「select count(*) from table

」時,myisam

只是簡單地讀出儲存好的行數,需要注意的是,

當count(*)

語句包含

where

條件時,

myisam

和innodb

的操作是一樣的。

innodb中不儲存表的具體行數,也就是說,

當執行select count(*) from table

時,innodb

要掃瞄一遍整個表來計算行數。

表級鎖定(更新時鎖定整個表):其鎖定機制是表級索引,

這雖然可以讓鎖定的實現成本很小,但是也同時大大降低了其併發效能。

不支援行級鎖,只支援併發插入的表鎖,主要用於高負載的select

。提供行級鎖(locking on row level

),提供與 

oracle 

型別一致的不加鎖讀取(

non-locking read

),另外,

innodb 

表的行鎖也不是絕對的,

如果在執行乙個 

sql 

語句時 

mysql 

不能確定要掃瞄的範圍,

那麼 innodb 

表同樣會鎖全表,

例如 update table

t_test_lhr

set num=1 where name like 

"%lhr%"。

mysql InnoDB引擎與鎖機制

共享鎖 s鎖 指讀鎖 排它鎖 x鎖 寫鎖,更新或刪除鎖共享鎖與共享鎖相容與排它鎖互斥,排它鎖與排它鎖 共享鎖都互斥 事務a對記錄加共享鎖,事務b對相同資料可以加共享鎖,但是不能加排它鎖 事務a對記錄加排它鎖,事務b對相同資料既不能加共享鎖也不能加排它鎖.select 時也可以顯示加共享鎖 在語句最後...

MySQL InnoDB的事務隔離與鎖

關於索引結構,前面有一篇文章 mysql索引原理總結 mvcc mysql innodb儲存引擎,實現的是基於多版本的併發控制協議 mvcc multi version concurrency control 讀不加鎖,讀寫不衝突。與mvcc相對的,是基於鎖的併發控制,lock based conc...

Mysql InnoDB引擎的索引與儲存結構詳解

前言 在oracle 和sql server等資料庫中只有一種儲存引擎,所有資料儲存管理機制都是一樣的。而mysql資料庫提供了多種儲存引擎。使用者可以根據不同的需求為資料表選擇不同的儲存引擎,使用者也可以根據自己的需要編寫自己的儲存引擎。mysql主要儲存引擎的區別 mysql預設的儲存引擎是my...