天天看點

【myISAM和innoDB】mySql的引擎myisam和innodb的差別/mysiam

目錄

​​Myisam 和Innodb 特點和擅長​​

​​Myisam 和Innodb 資料存儲差別​​

​​Myisam引擎(非聚集索引--葉子節點存儲資料位址的指針)​​

​​ Innodb引擎(聚集索引---葉子節點的data直接包含資料)​​

​​B+Tree的特性​​

​​行鎖和表鎖的差別​​

引擎在不斷的發展(比如InnoDB發展),是以不會去記具體的特性,在選型的時候才去看和對比。

簡單點說。。。

沒啥特殊的話請使用innodb。 myisam已被放棄。

(mySQL 選擇B+樹作為 索引的資料結構)

Myisam 和Innodb 特點和擅長

讀操作多用

MyISAM

寫操作多用

InnoDB

1、myisam查詢效率更高,查詢效率差myisam6-7倍。

2、innodb支援事務,行鎖,外鍵。myisam不支援。

如果資料表涉及的存儲資料多、查詢多,用myisam,如文章表。如果資料表涉及業務邏輯多,增删改操作多,就用innodb,如訂單表。

差別:

1. InnoDB支援事務,MyISAM不支援,對于InnoDB每一條SQL語言都預設封裝成事務,自動送出,這樣會影響速度,是以最好把多條SQL語言放在begin和commit之間,組成一個事務;

2. InnoDB支援外鍵,而MyISAM不支援。對一個包含外鍵的InnoDB表轉為MYISAM會失敗;

3. InnoDB是聚集索引,資料檔案是和索引綁在一起的,必須要有主鍵,通過主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然後再通過主鍵查詢到資料。是以,主鍵不應該過大,因為主鍵太大,其他索引也都會很大。而MyISAM是非聚集索引,資料檔案是分離的,索引儲存的是資料檔案的指針。主鍵索引和輔助索引是獨立的。

4. InnoDB不儲存表的具體行數,執行select count(*) from table時需要全表掃描。而MyISAM用一個變量儲存了整個表的行數,執行上述語句時隻需要讀出該變量即可,速度很快;

5、InnoDB支援行鎖

6、InnoDB:5.6以後才有全文索引;

 MyISAM:支援全文索引;不支援事務;它是表級鎖;會儲存表的具體行數.

如何選擇:

1. 是否要支援事務,如果要請選擇innodb,如果不需要可以考慮MyISAM;

2. 如果表中絕大多數都隻是讀查詢,可以考慮MyISAM,如果既有讀寫也挺頻繁,請使用InnoDB。

3. 系統奔潰後,MyISAM恢複起來更困難,能否接受;

4. MySQL5.5版本開始Innodb已經成為Mysql的預設引擎(之前是MyISAM),說明其優勢是有目共睹的,如果你不知道用什麼,那就用InnoDB,至少不會差。

推薦用InnoDB引擎.加了索引之後能夠大幅度的提高查詢速度,但是索引也不是越多越好,一方面它會占用存儲空間,另一方面它會使得寫操作變得很慢。通常我們對查詢次數比較頻繁,值比較多的列才建索引。

  例如:select * from user where sex = "女", 這個就不需要建立索引,因為性别一共就兩個值,查詢本身就是比較快的。

     select * from user where user_id = 1995 ,這個就需要建立索引,因為user_id的值是非常多的。

Myisam 和Innodb 資料存儲差別

Myisam引擎(非聚集索引--葉子節點存儲資料位址的指針)

  若以這個引擎建立資料庫表Create table user (…..),它實際是生成三個檔案:

  user.myi   索引檔案     user.myd資料檔案     user.frm資料結構類型。

   如下圖:當我們執行  select * from user where id = 1的時候,它的執行流程。

    (1)檢視該表的myi檔案有沒有以id為索引的索引樹。

    (2)根據這個id索引找到葉子節點的id值,進而得到它裡面的資料位址。(葉子節點存的是索引和資料位址)。

    (3)根據資料位址去myd檔案裡面找到對應的資料傳回出來。

    

【myISAM和innoDB】mySql的引擎myisam和innodb的差別/mysiam

 Innodb引擎(聚集索引---葉子節點的data直接包含資料)

  若以這個引擎建立資料庫表Create table user (…..),它實際是生成兩個檔案:

  user.ibd   索引檔案        user.frm資料結構類型

  因為innodb引擎建立表預設就是以主鍵為索引,是以不需要myi檔案。

  下圖為innodb表的結構圖:很顯然它與myisam最大的差別是将整條資料存在葉子節點,而不是位址。(葉子節點存的是主鍵索引和資料資訊)

  若此時,你在其他列建立索引例如name,它就會另外建立一個以name為索引的索引樹,(葉子節點存的是索引和主鍵索引)。

  你在執行select * from user where name = ‘吳磊’,他的執行過程如下:

    (1)找到name索引樹

    (2)根據name的值找到該樹下葉子的name索引和主鍵值

    (3)用主鍵值去主鍵索引樹去葉子節點到該條資料資訊

   

【myISAM和innoDB】mySql的引擎myisam和innodb的差別/mysiam

B+Tree的特性

  (1)由圖能看出,單節點能存儲更多資料,使得磁盤IO次數更少。

  (2)葉子節點形成有序連結清單,便于執行範圍操作。

  (3)聚集索引中,葉子節點的data直接包含資料;非聚集索引中,葉子節點存儲資料位址的指針。

【myISAM和innoDB】mySql的引擎myisam和innodb的差別/mysiam

   

行鎖和表鎖的差別

表級鎖:開銷小,加鎖快;不會出現死鎖;鎖定粒度大,發生鎖沖突的機率最高,并發度最低;

行級鎖:開銷大,加鎖慢;會出現死鎖;鎖定粒度最小,發生鎖沖突的機率最低,并發度也最高;    

頁面鎖:開銷和加鎖時間界于表鎖和行鎖之間;會出現死鎖;鎖定粒度界于表鎖和行鎖之間,并發度一般。

适用:從鎖的角度來說,表級鎖更适合于以查詢為主,隻有少量按索引條件更新資料的應用,如Web應用;而行級鎖則更适合于有大量按索引條件并發更新少量不同資料,同時又有并發查詢的應用,如一些線上事務處理(OLTP)系統。

MyISAM表鎖

對MyISAM表的讀操作,不會阻塞其他使用者對同一表的讀請求,但會阻塞對同一表的寫請求;

對MyISAM表的寫操作,則會阻塞其他使用者對同一表的讀和寫操作;

MyISAM表的讀操作與寫操作之間,以及寫操作之間是串行的。當一個線程獲得對一個表的寫鎖後,隻有持有鎖的線程可以對表進行更新操作。其他線程的讀、寫操作都會等待,直到鎖被釋放為止。