最開始用MySQL Administrator建數據庫的時候,表缺省是InnoDB類型,也就沒有在意。后來用Access2MySQL導數據的時候發現只能導成 MyISAM類型的表
區別如下原來是MyISAM類型不支持事務處理等高級處理,而InnoDB類型支持。
MyISAM類型的表強調的是性能,其執行數度比InnoDB類型更快,但是不提供事務支持,而InnoDB提供事務支持已經外部鍵等高級數據庫功能。
樣就可以根據數據表不同的用處用不同的存儲類型。
另外,MyISAM類型的二進制數據文件可以在不同操作系統中遷移。也就是可以直接從Windows系統拷貝到linux系統中使用。
修改引擎:
ALTER TABLE tablename ENGINE = MyISAM
---------
MyISAM:
這個是默認類型,它是基於傳統的ISAM類型,ISAM是Indexed Sequential Access Method (有索引的 順序訪問方法) 的縮寫,它是存儲記錄和文件的標准方法.與其他存儲引擎比較,MyISAM具有檢查和修復表格的大多數工具. MyISAM表格可以被壓縮,而且它們支持全文搜索.它們不是事務安全的,而且也不支持外鍵。如果事物回滾將造成不完全回滾,不具有原子性。如果執行大量的SELECT,MyISAM是更好的選擇。
InnoDB:
這種類型是事務安全的.它與BDB類型具有相同的特性,它們還支持外鍵.InnoDB表格速度很快.具有比BDB還豐富的特性,因此如果需要一個事務安全的存儲引擎,建議使用它.如果你的數據執行大量的INSERT或UPDATE,出於性能方面的考慮,應該使用InnoDB表,
對於支持事物的InnoDB類型的表,影響速度的主要原因是AUTOCOMMIT默認設置是打開的,而且程序沒有顯式調用BEGIN開始事務,導致每插入一條都自動Commit,嚴重影響了速度。可以在執行sql前調用begin,多條sql形成一個事物(即使autocommit打開也可以),將大大提高性能。
歸納如下:
- 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,Surface等。
- 沒有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時的作用較大???
===============================================================
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
測試命令:
use test;
drop table if exists tn;
create table tn (a varchar(10));
show create table tn;
5. 臨時改變默認表類型可以用:
set table_type=InnoDB;
show variables like 'table_type';
或:
c:/mysql/bin/mysqld-max-nt --standalone --default-table-type=InnoDB