檢視mysql版本
檢視mysql支援的存儲引擎
SHOW ENGINES;
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 存儲引擎 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建立的表,可以關聯查詢哦~。