MyISAM和InnoDB的區別

2021-10-08 14:29:52 字數 1197 閱讀 8381

學習自用,有錯麻煩提一下

innodb是mysql在...版本開始的預設引擎,

較大的區別是innodb支援事務,而myisam不支援事務(是沒有事務的概念?這就是他只有表鎖的原因?),

innodb支援意向鎖,行鎖,間隙鎖等,而myisam只支援表鎖

對於 他們的索引,innodb使用的是聚簇索引,意思是它的索引資料的物理順序和索引列值順序是一樣的,同時聚簇索引的整列資料是放在b樹葉子節點的,相比起來myisam的只在b樹葉子節點存放資料列的指標,所以他們innodb的索引和資料列組成乙個.idb檔案,而myisam的索引和資料檔案分開為兩個.myd和.myi;

同時因為聚簇索引的這個性質,myisam會比較簡單,它的資料排列順序取決於插入順序,也就是說直接往後新增資料,而innodb的插入需要保證和主鍵順序一樣速度才比較好,,所以innodb的主鍵一般設定為自增,這樣在後面也不會觸發葉子節點的**,這樣就可以減少索引的維護代價。,相反的,如果在中間插入,就可能會導致頁**(文章後面有講頁**),另外修改主鍵也會導致資料的移動

(innodb修改主鍵資料豈不是也要相應的去修改他們的輔助索引中的值?)

如果插入新的行 id 值為 700,則只需要在 r5 的記錄後面插入乙個新記錄。如果新插入的 id 值為 400,就相對麻煩了,需要邏輯上挪動後面的資料,空出位置。如果 r5 所在的資料頁已經滿了,根據 b+ 樹的演算法,這時候需要申請乙個新的資料頁,然後挪動部分資料過去,這個過程稱為頁**。在這種情況下,效能自然會受影響。除了效能外,頁**操作還影響資料頁的利用率。原本放在乙個頁的資料,現在分到兩個頁中,整體空間利用率降低大約 50%。

當然有**就有合併。當相鄰兩個頁由於刪除了資料,利用率很低之後,會將資料頁做合併。合併的過程,可以認為是**過程的逆過程(頁**和頁合併沒有圖就太抽象了,**後的新頁是分配在整個b+樹的最後面?)

另外一點重建索引:

由於資料頁**和合併,或者資料被刪除,資料頁會存在乙個空洞的位置,導致空間利用率不高。這個時候我們需要重建索引,提高頁面的利用率,使索引更加緊湊。

(怎麼操作?)

從上面可以看出,myisam適合插入頻繁的,比如說新聞資料庫,這種讀插頻繁,且修改的操作不多(讀還是innodb更快吧?)

且myisam不適合讀寫併發頻繁的,因為它的表鎖會導致阻塞

頁**的

myisam是設計成適合怎樣的場景

MySQL中MyISAM與InnoDB區別

mysql中myisam與innodb區別 myisam innodb 事物處理 不支援支援 外來鍵不支援 支援行鎖 不支援支援 全文索引 支援不支援 表的具體行數 儲存表的具體行數 掃瞄表來計算行數 delete表時 先drop表,然後重建表 一行一行的刪除 索引和資料 分開的,並且索引是有壓縮的...

MySQL中MyISAM與InnoDB區別及選擇

innodb 支援事務處理等 不加鎖讀取 支援外來鍵 支援行鎖 不支援fulltext型別的索引 不儲存表的具體行數,掃瞄表來計算有多少行 delete 表時,是一行一行的刪除 innodb 把資料和索引存放在表空間裡面 跨平台可直接拷貝使用 innodb中必須包含auto increment型別欄...

MySQL中MyISAM與InnoDB區別及選擇

支援事務處理等 不加鎖讀取 支援外來鍵 支援行鎖 不支援fulltext型別的索引 不儲存表的具體行數,掃瞄表來計算有多少行 delete 表時,是一行一行的刪除 innodb 把資料和索引存放在表空間裡面 跨平台可直接拷貝使用 innodb中必須包含auto increment型別欄位的索引 很難...