日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

mysql数据更新回退_Mysql的几个灵魂拷问(一)

發布時間:2023/11/27 生活经验 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的几个灵魂拷问(一)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。