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