天天看點

MyISAM與InnoDB 的差別(9個不同點)

差別:

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

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

3. InnoDB是聚集索引,使用B+Tree作為索引結構,資料檔案是和(主鍵)索引綁在一起的(表資料檔案本身就是按B+Tree組織的一個索引結構),必須要有主鍵,通過主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然後再通過主鍵查詢到資料。是以,主鍵不應該過大,因為主鍵太大,其他索引也都會很大。

       MyISAM是非聚集索引,也是使用B+Tree作為索引結構,索引和資料檔案是分離的,索引儲存的是資料檔案的指針。主鍵索引和輔助索引是獨立的。

       也就是說:InnoDB的B+樹主鍵索引的葉子節點就是資料檔案,輔助索引的葉子節點是主鍵的值;而MyISAM的B+樹主鍵索引和輔助索引的葉子節點都是資料檔案的位址指針。

MyISAM與InnoDB 的差別(9個不同點)
MyISAM與InnoDB 的差別(9個不同點)

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

那麼為什麼InnoDB沒有了這個變量呢?

    因為InnoDB的事務特性,在同一時刻表中的行數對于不同的事務而言是不一樣的,是以count統計會計算對于目前事務而言可以統計到的行數,而不是将總行數儲存起來友善快速查詢。InnoDB會嘗試周遊一個盡可能小的索引除非優化器提示使用别的索引。如果二級索引不存在,InnoDB還會嘗試去周遊其他聚簇索引。

    如果索引并沒有完全處于InnoDB維護的緩沖區(Buffer Pool)中,count操作會比較費時。可以建立一個記錄總行數的表并讓你的程式在INSERT/DELETE時更新對應的資料。和上面提到的問題一樣,如果此時存在多個事務的話這種方案也不太好用。如果得到大緻的行數值已經足夠滿足需求可以嘗試SHOW TABLE STATUS

5. Innodb不支援全文索引,而MyISAM支援全文索引,在涉及全文索引領域的查詢效率上MyISAM速度更快高;PS:5.7以後的InnoDB支援全文索引了

6. MyISAM表格可以被壓縮後進行查詢操作

7. InnoDB支援表、行(預設)級鎖,而MyISAM支援表級鎖

       InnoDB的行鎖是實作在索引上的,而不是鎖在實體行記錄上。潛台詞是,如果通路沒有命中索引,也無法使用行鎖,将要退化為表鎖。

  1. 例如:
  2.     t_user(uid, uname, age, sex) innodb;
  3.     uid PK
  4.     無其他索引
  5. update t_user set age= where uid= ;             命中索引,行鎖。
  6. update t_user set age= where uid != ;           未命中索引,表鎖。
  7. update t_user set age= where name= 'chackca';    無索引,表鎖。

8、InnoDB表必須有唯一索引(如主鍵)(使用者沒有指定的話會自己找/生産一個隐藏列Row_id來充當預設主鍵),而Myisam可以沒有

9、Innodb存儲檔案有frm、ibd,而Myisam是frm、MYD、MYI

        Innodb:frm是表定義檔案,ibd是資料檔案

        Myisam:frm是表定義檔案,myd是資料檔案,myi是索引檔案

如何選擇:

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

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

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

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

InnoDB為什麼推薦使用自增ID作為主鍵?

    答:自增ID可以保證每次插入時B+索引是從右邊擴充的,可以避免B+樹和頻繁合并和分裂(對比使用UUID)。如果使用字元串主鍵和随機主鍵,會使得資料随機插入,效率比較差。

innodb引擎的4大特性

       插入緩沖(insert buffer),二次寫(double write),自适應哈希索引(ahi),預讀(read ahead)

差別:

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

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

3. InnoDB是聚集索引,使用B+Tree作為索引結構,資料檔案是和(主鍵)索引綁在一起的(表資料檔案本身就是按B+Tree組織的一個索引結構),必須要有主鍵,通過主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然後再通過主鍵查詢到資料。是以,主鍵不應該過大,因為主鍵太大,其他索引也都會很大。

       MyISAM是非聚集索引,也是使用B+Tree作為索引結構,索引和資料檔案是分離的,索引儲存的是資料檔案的指針。主鍵索引和輔助索引是獨立的。

       也就是說:InnoDB的B+樹主鍵索引的葉子節點就是資料檔案,輔助索引的葉子節點是主鍵的值;而MyISAM的B+樹主鍵索引和輔助索引的葉子節點都是資料檔案的位址指針。

MyISAM與InnoDB 的差別(9個不同點)
MyISAM與InnoDB 的差別(9個不同點)

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

那麼為什麼InnoDB沒有了這個變量呢?

    因為InnoDB的事務特性,在同一時刻表中的行數對于不同的事務而言是不一樣的,是以count統計會計算對于目前事務而言可以統計到的行數,而不是将總行數儲存起來友善快速查詢。InnoDB會嘗試周遊一個盡可能小的索引除非優化器提示使用别的索引。如果二級索引不存在,InnoDB還會嘗試去周遊其他聚簇索引。

    如果索引并沒有完全處于InnoDB維護的緩沖區(Buffer Pool)中,count操作會比較費時。可以建立一個記錄總行數的表并讓你的程式在INSERT/DELETE時更新對應的資料。和上面提到的問題一樣,如果此時存在多個事務的話這種方案也不太好用。如果得到大緻的行數值已經足夠滿足需求可以嘗試SHOW TABLE STATUS

5. Innodb不支援全文索引,而MyISAM支援全文索引,在涉及全文索引領域的查詢效率上MyISAM速度更快高;PS:5.7以後的InnoDB支援全文索引了

6. MyISAM表格可以被壓縮後進行查詢操作

7. InnoDB支援表、行(預設)級鎖,而MyISAM支援表級鎖

       InnoDB的行鎖是實作在索引上的,而不是鎖在實體行記錄上。潛台詞是,如果通路沒有命中索引,也無法使用行鎖,将要退化為表鎖。

  1. 例如:
  2.     t_user(uid, uname, age, sex) innodb;
  3.     uid PK
  4.     無其他索引
  5. update t_user set age= where uid= ;             命中索引,行鎖。
  6. update t_user set age= where uid != ;           未命中索引,表鎖。
  7. update t_user set age= where name= 'chackca';    無索引,表鎖。

8、InnoDB表必須有唯一索引(如主鍵)(使用者沒有指定的話會自己找/生産一個隐藏列Row_id來充當預設主鍵),而Myisam可以沒有

9、Innodb存儲檔案有frm、ibd,而Myisam是frm、MYD、MYI

        Innodb:frm是表定義檔案,ibd是資料檔案

        Myisam:frm是表定義檔案,myd是資料檔案,myi是索引檔案

如何選擇:

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

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

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

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

InnoDB為什麼推薦使用自增ID作為主鍵?

    答:自增ID可以保證每次插入時B+索引是從右邊擴充的,可以避免B+樹和頻繁合并和分裂(對比使用UUID)。如果使用字元串主鍵和随機主鍵,會使得資料随機插入,效率比較差。

innodb引擎的4大特性

       插入緩沖(insert buffer),二次寫(double write),自适應哈希索引(ahi),預讀(read ahead)