天天看點

mysql-innodb和myisam存儲引擎

作者:瓦下枯草

檢視mysql版本

mysql-innodb和myisam存儲引擎

檢視mysql支援的存儲引擎

SHOW ENGINES;

mysql-innodb和myisam存儲引擎

MyISAM與InnoBD對比

MyISAM InnoDB

存儲結構

Mysql8以前是.frm,之後被.sdi替換掉

每個MyISAM在磁盤上存儲成三個檔案。第一個檔案的名字以表的名字開始,擴充名指出檔案類型。

.frm/.sdi檔案存儲表定義;

資料檔案的擴充名為.MYD (MYData);

索引檔案的擴充名是.MYI (MYIndex);

.idb 結構、索引和資料;
事務 不提供事務支援 支援事務,復原,對于有update ,delete操作的表,效率更好
UPDATE,INSERT,Delete操作 如果執行大量的SELECT,MyISAM是更好的選擇

1.如果你的資料執行大量的INSERT或UPDATE,出于性能方面的考慮,應該使用InnoDB表;

2.DELETE FROM table時,InnoDB不會重建立立表,而是一行一行的删除;

對AUTO_INCREMENT的操作

每表一個AUTO_INCREMEN列的内部處理。

MyISAM為INSERT和UPDATE操作自動更新這一列。這使得AUTO_INCREMENT列更快(至少10%)。在序列頂的值被删除之後就不能再利用。(當AUTO_INCREMENT列被定義為多列索引的最後一列,可以出現重使用從序列頂部删除的值的情況)。

AUTO_INCREMENT值可用ALTER TABLE或myisamch來重置

對于AUTO_INCREMENT類型的字段,InnoDB中必須包含隻有該字段的索引,但是在MyISAM表中,可以和其他字段一起建立聯合索引

更好和更快的auto_increment處理

如果你為一個表指定AUTO_INCREMENT列,在資料詞典裡的InnoDB表句柄包含一個名為自動增長計數器的計數器,它被用在為該列賦新值;

自動增長計數器僅被存儲在主記憶體中,而不是存在磁盤上;

表的具體行數 select count(*) from table,MyISAM隻要簡單的讀出儲存好的行數,注意的是,當count(*)語句包含 where條件時,兩種表的操作是一樣的 InnoDB 中不儲存表的具體行數,也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行
表鎖

提供行鎖(locking on row level),提供與 Oracle 類型一緻的不加鎖讀取(non-locking read in

SELECTs),

另外,InnoDB表的行鎖也不是絕對的,如果在執行一個SQL語句時MySQL不能确定要掃描的範圍,InnoDB表同樣會鎖全表, 例如update table set num=1 where name like "%aaa%"

索引 索引都不是聚簇索引,在查詢時至少需要進行一次的回表查詢,其執行的過程:先通過索引表查詢到索引對應該行的實體位址,然後去讀該實體位址的值 主鍵索引就是聚簇索引(葉子節點會存儲資料行),通過主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然後再通過主鍵查詢到資料。是以,主鍵不應該過大,因為主鍵太大,其他索引也都會很大
主鍵 可以沒有,不支援外鍵 每張表預設都需要主鍵;
容災恢複 不支援

a.Innodb 記憶體結構中有log buffer,當有更新的時候,先寫入log,并更新到記憶體,innodb會在空閑的時候更新磁盤。有了 redo log(是 InnoDB 引擎特有的),InnoDB 就可以保證即使資料庫發生異常重新開機,之前送出的記錄都不會丢失,這個能力稱為 crash-safe。

redo log 是實體日志,記錄的是“在某個資料頁上做了什麼修改”;

bin log 是邏輯日志,記錄的是這個語句的原始邏輯,比如“給 ID=2 這一行的 c 字段加 1 ”。

全表行數 有存儲,變量存儲 無存儲

存儲結構

win系統安裝的mysql,檔案示例如下

student是innodb,student_data是myisamdb

mysql-innodb和myisam存儲引擎

MySQL 存儲引擎 MyISAM 與 InnoDB 如何選擇?

雖然 MySQL 裡的存儲引擎不隻是 MyISAM 與 InnoDB 這兩個,但常用的就是它倆了。可能有站長并未注意過 MySQL 的存儲引擎,其實存儲引擎也是資料庫設計裡的一大重要點,那麼部落格系統應該使用哪種存儲引擎呢?

下面我們分别來看兩種存儲引擎的差別。

一、InnoDB支援事務,MyISAM不支援,這一點是非常之重要。事務是一種進階的處理方式,如在一些列增删改中隻要哪個出錯還可以復原還原,而MyISAM就不可以了;

二、MyISAM适合查詢以及插入為主的應用,InnoDB适合頻繁修改以及涉及到安全性較高的應用;

三、InnoDB支援外鍵,MyISAM不支援;

四、MySQL 在 5.1 之前版本預設存儲引擎是 MyISAM,5.1 之後版本預設存儲引擎是 InnoDB;

五、InnoDB不支援FULLTEXT類型的索引;

六、InnoDB中不儲存表的行數,如select count(*) from table時,InnoDB需要掃描一遍整個表來計算有多少行,但是MyISAM隻要簡單的讀出儲存好的行數即可。注意的是,當count(*)語句包含where條件時MyISAM也需要掃描整個表;

七、對于自增長的字段,InnoDB中必須包含隻有該字段的索引,但是在MyISAM表中可以和其他字段一起建立聯合索引;

八、清空整個表時,InnoDB是一行一行的删除,效率非常慢。MyISAM則會重建表;

九、InnoDB支援行鎖(某些情況下還是鎖整表,如 update table set a=1 where user like '%lee%';

注意:innodb與myisamdb建立的表,可以關聯查詢哦~。

繼續閱讀