聊一聊MyISAM和InnoDB的區別

2022-09-24 20:45:15 字數 2475 閱讀 1679

主要有以下區別:

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,pejthqolygon,su***ce等。

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 '使用者ejthq密碼,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的區別

本文位址: /shujuku/mysql/339425.html

聊一聊小甜餅

cookies程式設計 cookie是儲存在客戶端的小文字,儲存的位置分為兩種 cookie可能儲存在客戶端瀏覽器的所佔記憶體中,關閉瀏覽器後,cookies就不再存在。cookie也可能儲存在客戶pc機的硬碟上,設定有效時間,超過有效時間後失效。cookie的常見應用 簡化登入 很多 在登入時,可...

聊一聊動態規劃

一 問題 看乙個經常被引用的問題 例子1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 例子2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 問你例子1是多少時,你乙個個算後,結果是20 接著問你例子2時,你會馬上說出21,為什...

聊一聊元資料

這個話題來自我的msn space。這是原文 元資料 metadata 這個詞現在到處氾濫。其實我對元資料充其量只能說有自己的理解而已,並不能確信這個理解是正確的。我認為,資料結構分為三個層次 uml可是四層哦 例項層 直接描述特異化的資料場景 元資料層 描述例項的結構的一組資料 元資料的元資料層 ...