mysql数据更新回退_Mysql的几个灵魂拷问(一)
開發對于數據庫的了解可不能局限于CURD,數據庫的技能復雜度也不是僅僅寫幾個復雜的sql語句,這個Mysql系列就是對數據庫由淺到深的總結。
一、基礎概念
myisam 和 innodb的區別嗎?
myisam引擎是5.1版本之前的默認引擎,支持全文檢索、壓縮、空間函數等,但是不支持事務和行級鎖,所以一般用于有大量查詢少量插入的場景來使用,而且myisam不支持外鍵,并且索引和數據是分開存儲的。系統奔潰后,MyISAM恢復起來很困難。
innodb是基于聚簇索引建立的,和myisam相反它支持事務、外鍵,并且通過MVCC來支持高并發,索引和數據存儲在一起。
說了很多,最需要記住的InnoDB不同于MyISAM最大的兩個特點就是:一是支持事務,二是支持行鎖;毋庸置疑,因為這兩個特性大部分都采用InnoDB引擎,其中的支持行鎖就是InnoDB適合多并發優勢所在,這個在第三篇鎖和事務會重點講到的。
mysql的索引有哪些,聚簇和非聚簇索引又是什么?
索引按照數據結構來說主要包含B+樹和Hash索引。
主鍵索引的葉子節點存的是整行數據。在 InnoDB 里,主鍵索引也被稱為聚簇索引(clustered index)。
非主鍵索引的葉子節點內容是主鍵的值。在 InnoDB 里,非主鍵索引也被稱為二級索引(secondary index)。
聚簇索引查詢相對會更快一些,因為主鍵索引樹的葉子節點直接就是我們要查詢的整行數據了。而非主鍵索引的葉子節點是主鍵的值,查到主鍵的值以后,還需要再通過主鍵的值再進行一次查詢(這個過程叫做回表, 也就是查了兩個索引樹)。
什么是覆蓋索引和回表嗎?
回表就是先通過數據庫索引掃描出數據所在的行,再通過行主鍵id取出索引中未提供的數據,即基于非主鍵索引的查詢需要多掃描一棵索引樹。
如果一個索引包含(或者說覆蓋)所有需要查詢的字段的值,我們就稱之為“覆蓋索引”。我們知道InnoDB存儲引擎中,如果不是主鍵索引,葉子節點存儲的是主鍵+列值。最終還是要“回表”,也就是要通過主鍵再查找一次。這樣就會比較慢覆蓋索引就是把要查詢出的列和索引是對應的,不做回表操作!
而要確定一個查詢是否是覆蓋索引,我們只需要explain sql語句看Extra的結果是否是“Using index”即可。
最左前綴原則
對多個字段同時建立的索引(有順序,ABC,ACB是完全不同的兩種聯合索引。)以聯合索引(a,b,c)為例,建立這樣的索引相當于建立了索引a、ab、abc三個索引。
所以在建立聯合索引的時候,如何安排索引內的字段順序?
這里我們的評估標準是,索引的復用能力。因為可以支持最左前綴,所以當已經有了 (a,b) 這個聯合索引后,一般就不需要單獨在 a 上建立索引了。因此,第一原則是,如果通過調整順序,可以少維護一個索引,那么這個順序往往就是需要優先考慮采用的。
索引下推
MySQL 5.6引入了索引下推優化,可以在索引遍歷過程中,對索引中包含的字段先做判斷,過濾掉不符合條件的記錄,減少回表字數。
如果沒有索引下推優化(或稱ICP優化),當進行索引查詢時,首先根據索引來查找記錄,然后再根據where條件來過濾記錄;在支持ICP優化后,MySQL會在取出索引的同時,判斷是否可以進行where條件過濾再進行索引查詢,也就是說提前執行where的部分過濾操作,在某些場景下,可以大大減少回表次數,從而提升整體性能
二、Mysql架構與原理
Mysql的架構圖
Server層四大組件:連接器,解析器,優化器和執行器。
存儲引擎層負責數據的存儲和提取。其架構模式是插件式的,支持 InnoDB、MyISAM
Mysql的數據更新流程
1、加載磁盤文件到buffer Pool中;
2、更新數據之前,寫入舊數據到undo日志,便于回退;
3、更新內存中的buffer pool數據;
4、將更新部分的redo log寫入到redo log buffer中;
5、redo日志刷入磁盤
6、binlog日志刷入磁盤
7、將binlog文件和位置寫入到redo日志文件中,并寫入commit。
8、后臺的IO線程某個時間隨機將buffer pool中的臟數據同步到磁盤文件。
Mysql架構這一部分已經在另外一篇博客里Mysql篇之架構設計做了詳細的講解了。
總結
以上是生活随笔為你收集整理的mysql数据更新回退_Mysql的几个灵魂拷问(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 5.7版本mysql操做语法_mysql
- 下一篇: 川流不息是哪首歌啊?