MySQL 中 MyISAM 中的查询为什么比 InnoDB 快?
MySQL 中 MyISAM 中的查詢?yōu)槭裁幢?InnoDB 快?
關(guān)于,這個問題,我網(wǎng)上看了很多答案。大多內(nèi)容都雷同,但是我要強調(diào)的是,并不是說 MYISAM 一定比 InnoDB 的 select 快。
其實呢?MyISAM 適合讀多,并發(fā)少的場景;這個問題要分場景來看。不同的場景,還真不能說 MyISAM 比 InnoDB 中的查詢快!
下面我們一起來看看 Innodb 和 Myisam 的 5 大區(qū)別:
上面的“事務(wù)”寫錯了。不過,我相信大家能看明白其中的解釋。
關(guān)于“行鎖”還是“表鎖”,可以看我的這篇文章《InnoDB 的 select 行鎖還是表鎖》。
關(guān)于 count 的區(qū)別,可以看我的這篇文章《你真的懂 select count(*) 嗎?》。
那么為什么大家喜歡說 MyisAM 查詢快呢?那是因為,InnoDB 的表是根據(jù)主鍵進行展開的 B+tree 的聚集索引。MyIsam 則非聚集型索引,myisam 存儲會有兩個文件,一個是索引文件,另外一個是數(shù)據(jù)文件,其中索引文件中的索引指向數(shù)據(jù)文件中的表數(shù)據(jù)。
聚集型索引并不是一種單獨的索引類型,而是一種存儲方式,InnoDB 聚集型索引實際上是在同一結(jié)構(gòu)中保存了 B+tree 索引和數(shù)據(jù)行。當有聚簇索引時,它的索引實際放在葉子頁中。
結(jié)合上圖,可以看出:INNODB 在做 SELECT 的時候,要維護的東西比 MYISAM 引擎多很多。
InnoDB:通過為每一行記錄添加兩個額外的隱藏的值來實現(xiàn) MVCC,這兩個值一個記錄這行數(shù)據(jù)何時被創(chuàng)建,另外一個記錄這行數(shù)據(jù)何時過期(或者被刪除)。但是 InnoDB 并不存儲這些事件發(fā)生時的實際時間,相反它只存儲這些事件發(fā)生時的系統(tǒng)版本號。這是一個隨著事務(wù)的創(chuàng)建而不斷增長的數(shù)字。每個事務(wù)在事務(wù)開始時會記錄它自己的系統(tǒng)版本號。每個查詢必須去檢查每行數(shù)據(jù)的版本號與事務(wù)的版本號是否相同。讓我們來看看當隔離級別是 REPEATABLEREAD 時這種策略是如何應(yīng)用到特定的操作的:
SELECT InnoDB 必須每行數(shù)據(jù)來保證它符合兩個條件:
說白了,為什么現(xiàn)在一些人喜歡 NoSQL 呢?因為 nosql 本身似乎應(yīng)該是以省去解析和事務(wù)鎖的方式來提升效能。MYISAM 不支持事務(wù),也是它查詢快的一個原因!
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的MySQL 中 MyISAM 中的查询为什么比 InnoDB 快?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CPU调度时间片
- 下一篇: MySQL事务隔离级别和实现原理