1. 程式人生 > 資料庫 >聊一聊MyISAM和InnoDB的區別

聊一聊MyISAM和InnoDB的區別

主要有以下區別:

1、MySQL預設採用的是MyISAM。

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

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

4、InnoDB支援外來鍵,MyISAM不支援。

5、InnoDB的主鍵範圍更大,最大是MyISAM的2倍。

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

7、MyISAM支援GIS資料,InnoDB不支援。即MyISAM支援以下空間資料物件:Point,Line,Polygon,Surface等。

8、沒有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時的作用較大。

補充知識:MySQL中ENGINE=InnoDB、AUTO_INCREMENT的意思

如下所示:

CREATE TABLE `hui_user` (
 `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '使用者表id',`username` varchar(50) NOT NULL COMMENT '使用者名稱',`password` varchar(50) NOT NULL COMMENT '使用者密碼,MD5加密',`email` varchar(50) DEFAULT NULL,`phone` varchar(20) DEFAULT NULL,`question` varchar(100) DEFAULT NULL COMMENT '找回密碼問題',`answer` varchar(100) DEFAULT NULL COMMENT '找回密碼答案',`role` int(4) NOT NULL COMMENT '角色0-管理員,1-普通使用者',`create_time` datetime NOT NULL COMMENT '建立時間',`update_time` datetime NOT NULL COMMENT '最後一次更新時間',PRIMARY KEY (`id`),UNIQUE KEY `user_name_unique` (`username`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8;

在這個sql語句中,出現了這樣的

ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8;

但不太明白最後那三項是幹嘛的?

1. ENGINE=InnoDB不是預設就是這個引擎嗎?

2. AUTO_INCREMENT=22,它不是自增的嗎?為什麼還要設數字?

3. utf8不是已經在my.ini裡設定過了?

ENGINE=InnoDB不是預設就是這個引擎嗎?

——是的,如果不寫也是ok,就會走預設的,在這裡寫上是因為可以很清楚的看到這個建表語句用了哪些,而且在建立表的時候,寫上也是一個很好的習慣

AUTO_INCREMENT=22,它不是自增的嗎?為什麼還要設數字?

——這個是自增的,在這裡設定數字的意思是想要讓這條語句在增長的時候,從22開始自增。

utf8不是已經在my.ini裡設定過了?

——這個雖然在my.ini設定過了,但設定的是mysql的的語言編碼,而這裡建立的時候不設定,就會出現亂碼問題,二者的作用域是不一樣的,在建立表單的時候,這個charset會作用到這個表上,他代表mysql簡歷資料庫資料表時設定字符集為utf-8

以上這篇聊一聊MyISAM和InnoDB的區別就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。