Mysql MyIsam和InnoDB的區別

2021-09-07 15:48:31 字數 3008 閱讀 3185

myisam:

這個是預設型別,它是基於傳統的isam型別,isam是indexed sequential access method (有索引的 順序訪問方法) 的縮寫,它是儲存記錄和檔案的標準方法.與其他儲存引擎比較,myisam具有檢查和修復**的大多數工具. myisam**可以被壓縮,而且它們支援全文搜尋.它們不是事務安全的,而且也不支援外來鍵。如果事物回滾將造成不完全回滾,不具有原子性。如果執行大量的select,myisam是更好的選擇。

innodb:

這種型別是事務安全的.它與bdb型別具有相同的特性,它們還支援外來鍵.innodb**速度很快.具有比bdb還豐富的特性,因此如果需要乙個事務安全的儲存引擎,建議使用它.如果你的資料執行大量的insert或update,出於效能方面的考慮,應該使用innodb表,

對於支援事物的innodb型別的表,影響速度的主要原因是autocommit預設設定是開啟的,而且程式沒有顯式呼叫begin開始事務,導致每插入一條都自動commit,嚴重影響了速度。

所以可以在執行sql前呼叫begin,結束呼叫end,多條sql形成乙個事務(即使autocommit開啟也可以),將大大提高效能。

建立表的時候應該標註使用innodb 

create table ]menu (

id varchar(

100) not null comment 'pk'

, ... ...

primary key (id)

) engine

=innodb default charset=utf8 comment='

選單表';

歸納如下:

mysql預設採用的是myisam。

myisam不支援事務,而innodb支援。innodb的autocommit預設是開啟的,即每條sql語句會預設被封裝成乙個事務,自動提交,這樣會影響速度,所以最好是把多條sql語句顯示放在begin和commit之間,組成乙個事務去提交。

innodb支援資料行鎖定,myisam不支援行鎖定,只支援鎖定整個表。即myisam同乙個表上的讀鎖和寫鎖是互斥的,myisam併發讀寫時如果等待佇列中既有讀請求又有寫請求,預設寫請求的優先順序高,即使讀請求先到,所以myisam不適合於有大量查詢和修改並存的情況,那樣查詢程序會長時間阻塞。因為myisam是鎖表,所以某項讀操作比較耗時會使其他寫程序餓死。

innodb支援外來鍵,myisam不支援。

innodb的主鍵範圍更大,最大是myisam的2倍。

innodb不支援全文索引,而myisam支援。全文索引是指對char、varchar和text中的每個詞(停用詞除外)建立倒排序索引。myisam的全文索引其實沒啥用,因為它不支援中文分詞,必須由使用者分詞後加入空格再寫到資料表裡,而且少於4個漢字的詞會和停用詞一樣被忽略掉。

myisam支援gis資料,innodb不支援。即myisam支援以下空間資料物件:point,line,polygon,su***ce等。

沒有where的count(*)使用myisam要比innodb快得多。因為myisam內建了乙個計數器,count(*)時它直接從計數器中讀,而innodb必須掃瞄全表。所以在innodb上執行count(*)時一般要伴隨where,且where中要包含主鍵以外的索引列。為什麼這裡特別強調「主鍵以外」?因為innodb中primary index是和raw data存放在一起的,而secondary index則是單獨存放,然後有個指標指向primary key。所以只是count(*)的話使用secondary index掃瞄更快,而primary key則主要在掃瞄索引同時要返回raw data時的作用較大???

因此,當你的資料庫有大量的寫入、更新操作而查詢比較少或者資料完整性要求比較高的時候就選擇innodb表。

當你的資料庫主要以查詢為主,相比較而言更新和寫入比較少,並且業務方面資料完整性要求不那麼嚴格,就選擇mysiam表。

因為mysiam表的查詢操作效率和速度都比innodb要快

1. 4.0以上mysqld(mysql deamon)都支援事務,包括非max版本。3.23的需要max版本mysqld才能支援事務。

2. 建立表時如果不指定type則預設為myisam,不支援事務。

可以用show create table tablename 命令看錶的型別。

2.1 對不支援事務的表做start/commit操作沒有任何效果,在執行commit前已經提交,測試:

執行乙個msyql:

use test;

drop table if exists tn;

create table tn (a varchar(10)) type=myisam;

drop table if exists ty;

create table ty (a varchar(10)) type=innodb;

begin;

insert into tn values('a');

insert into ty values('a');

select * from tn;

select * from ty;

都能看到一條記錄

執行另乙個mysql:

use test;

select * from tn;

select * from ty;

只有tn能看到一條記錄

然後在另一邊

commit;

才都能看到記錄。

3. 可以執行以下命令來切換非事務表到事務(資料不會丟失),innodb錶比myisam表更安全:

alter table tablename type=innodb;

3.1 innodb表不能用repair table命令和myisamchk -r table_name

但可以用check table,以及mysqlcheck [options] database [tables]

4. 啟動mysql資料庫的命令列中新增了以下引數可以使新發布的mysql資料表都預設為使用事務(

只影響到create語句。)

-- default-table-type=innodb

mysql MYISAM表批量壓縮

關於對myisam表的壓縮,可以使用myisampack和myisamchk完成 myisampack完之後必須進行myisamchk才能使用壓縮後的表,而且是唯讀的 其詳細地用法可以參考官方文件 這兩個操作需要謹慎使用,在壓縮之前需要確認mysqld已關閉或者要壓縮的表不會有其他的sql操作 而且...

mysql資料庫引擎 MyISAM和InnoDB

mysql 優化系列 一 mysql資料庫引擎效能測試 mysql 資料庫中,最常用的兩種引擎是innordb和myisam。innordb的功能要比myiasm強大很多,但是innordb的效能要比myisam差很多,如果你的 只是做簡單的查詢,更新,刪除,那麼用myiasm是最好的選擇。所有的效...

儲存引擎是什麼?常用的MyISAM和InnoDB

什麼是儲存引擎?mysql中的資料用各種不同的技術儲存在檔案 或者記憶體 中。這些技術中的每一種技術都使用不同的儲存機制 索引技巧 鎖定水平並且最終提供廣泛的不同的功能和能力。通過選擇不同的技術,你能夠獲得額外的速度或者功能,從而改善你的應用的整體功能。myisam 這種儲存引擎是基於isam儲存引...