主頁 > 資料庫 > 一條SQL更新陳述句是如何執行的

一條SQL更新陳述句是如何執行的

2022-02-06 06:25:11 資料庫

文章首發于公眾號「蟬沐風」,認真寫好每一篇文章,歡迎大家關注交流

這是圖解MySQL的第2篇文章,這篇文章會通過一條SQL更新陳述句的執行流程讓大家清楚地明白:

  • 什么是InnoDB頁?快取頁又是什么?為什么這么設計?
  • 什么是表空間?不同存盤引擎的表在檔案系統的底層表示上有什么區別?
  • Buffer Pool是什么?為什么需要?有哪些我們需要掌握的細節?
  • MySQL的三種日志檔案redo日志、undo日志、binlog分別是什么?為什么需要這么多種型別的日志?

正文開始!


之前我們講過了一條SQL查詢陳述句是如何執行的,那么插入(INSERT)、更新(UPDATE)和洗掉(DELETE)操作的流程又是什么樣子呢?

其實對于MySQL而言,只有兩種通常意義的操作,一種是Query(查詢),另一種是Update(更新),后者包含了我們平常使用的INSERT、UPDATE和DELETE操作,

那么MySQL的更新流程和查詢流程有什么區別呢?

其實基本的流程是一致的,也要經過處理連接決議優化存盤引擎幾個步驟,主要區別在更新操作涉及到了MySQL更多的細節,

image (2)

注:我們接下來的所有描述,針對的都是InnoDB存盤引擎,如果涉及到其他存盤引擎,將會特殊說明

1. 一些需要知道的概念

對于MySQL任何存盤引擎來說,資料都是存盤在磁盤中的,存盤引擎要操作資料,必須先把磁盤中的資料加載到記憶體中才可以,

那么問題來了,一次性從磁盤中加載多少資料到記憶體中合適呢?當獲取記錄時,InnoDB存盤引擎需要一條條地把記錄從磁盤中讀取出來嗎?

當然不行!我們知道磁盤的讀寫速度和記憶體讀寫速度差了幾個數量級,如果我們需要讀取的資料恰好運行在磁盤的不同位置,那就意味著會產生多次I/O操作,

因此,無論是作業系統也好,MySQL存盤引擎也罷,都有一個預讀取的概念,概念的依據便是統治計算機界的區域性原理,

空間區域性:如果當前資料是正在被使用的,那么與該資料空間地址臨近的其他資料在未來有更大的可能性被使用到,因此可以優先加載到暫存器或主存中提高效率

就是當磁盤上的一塊資料被讀取的時候,我們干脆多讀一點,而不是用多少讀多少,

1.1 InnoDB頁

InnoDB存盤引擎將資料劃分為若干個頁,以頁作為磁盤和記憶體之間互動的最小單位,InnoDB中頁的大小默認為16KB,也就是默認情況下,一次最少從磁盤中讀取16KB的資料到記憶體中,一次最少把記憶體中16KB的內容重繪到磁盤上,

image-20220203230329849

對于InnoDB存盤引擎而言,所有的資料(存盤用戶資料的索引、各種元資料、系統資料)都是以頁的形式進行存盤的,

1.2 表空間

為了更好地管理頁,MySQL又設計了「表空間」的概念,表空間又有很多型別,具體型別我們不需要知道,我們只需要知道,一個表空間可以劃分成很多個InnoDB頁,InnoDB表資料都存盤在某個表空間的頁中,

為了方便我們定位,MySQL貼心的為表空間設計了一個唯一標識——表空間ID(space ID),同理,InnoDB頁也有自己的唯一編號——頁號(page number),

因此,我們可以這么認為,給定表空間ID和頁號以及頁的偏移量,我們就可以定位到InnoDB頁的某條記錄,也就是資料庫表的某條記錄,

1.2.1 資料表在檔案系統中的表示

為了更好地讓大家理解這個抽象的概念,我創建了名為test的資料庫,在其下分別創建了3張表t_user_innodbt_user_myisamt_user_memory,對應的存盤引擎分別為InnoDBMyISAMMEMORY

進入MySQL的資料目錄,找到test目錄,看一下test資料庫下所有表對應的本地檔案目錄

drwxr-x--- 2 mysql mysql  4096 Jan 26 09:28 .
drwxrwxrwt 6 mysql mysql  4096 Jan 26 09:24 ..
-rw-r----- 1 mysql mysql    67 Jan 26 09:24 db.opt
-rw-r----- 1 mysql mysql  8556 Jan 26 09:28 t_user_innodb.frm
-rw-r----- 1 mysql mysql 98304 Jan 26 09:28 t_user_innodb.ibd
-rw-r----- 1 mysql mysql  8556 Jan 26 09:27 t_user_memory.frm
-rw-r----- 1 mysql mysql     0 Jan 26 09:28 t_user_myisam.MYD
-rw-r----- 1 mysql mysql  1024 Jan 26 09:28 t_user_myisam.MYI
-rw-r----- 1 mysql mysql  8556 Jan 26 09:28 t_user_myisam.frm

1.2.2 InnoDB是如何存盤表資料的

「表空間」是InnoDB存盤引擎獨有的概念,

我們看到t_user_innodb表在資料庫對應的test目錄下會生成以下兩個檔案

  • t_user_innodb.frm
  • t_user_innodb.ibd

其中,t_user_innodb.ibd就是t_user_innodb表對應的表空間在檔案系統上的表示;t_user_innodb.frm用來描述表的結構,如表有哪些列,列的型別是什么等,

1.2.3 MyISAM是如何存盤表資料的

和InnoDB不同,MyISAM沒有表空間的概念,表的資料和索引全都直接存放在對應的資料庫子目錄下,可以看到t_user_myisam對應了三個檔案

  • t_user_myisam.MYD
  • t_user_myisam.MYI
  • t_user_myisam.frm

其中,t_user_myisam.MYD表示表的資料檔案,也就是我們實際看到的資料表的內容;t_user_myisam.MYI表示表的索引檔案,為該表創建的索引都會存放在這個檔案中;t_user_myisam.frm用來描述表的結構,

1.2.4 MEMORY是如何存盤表資料的

MEMORY存盤引擎對應的資料表只有一個描述表結構的檔案t_user_memory.frm,

2. 緩沖池Buffer Pool

為了更好的利用區域性原理帶給我們的優勢,InnoDB在處理客戶端請求時,如果需要訪問某個頁的資料,會把該資料所在的頁的全部資料加載到記憶體中,哪怕是只需要訪問一個頁中的一條資料,也需要加載整個頁,

從磁盤中加載資料到記憶體中的操作太昂貴了!有什么辦法可以提高資料操作的效率呢?快取!

為了快取磁盤的頁,InnoDB在MySQL服務器啟動時會向作業系統申請一片連續的記憶體區域,這片記憶體區域就是Buffer Pool

很容易理解,為了更好地快取頁資料,Buffer Pool對應的一片連續記憶體空間也被劃分為若干個頁,而且默認情況下,Buffer Pool頁的大小和InnoDB頁大小一樣,都是16KB,為了區分兩種不同的頁,我們將Buffer Pool中的頁面稱為緩沖頁,

image-20220203233236832

讀取資料的時候,InnoDB先判斷資料是否在Buffer Pool中,如果是,則直接讀取資料進行操作,不用再次從磁盤加載;如果不是,則從磁盤加載到Buffer Pool中,然后讀取資料進行操作,

修改資料的時候,也是將資料先寫到Buffer Pool緩沖頁中,而不是每次更新操作都直接寫入磁盤,當緩沖頁中的資料和磁盤檔案不一致的時候,緩沖頁被稱為臟頁,

那么臟頁是什么時候被同步到磁盤呢?

InnoDB中有專門的后臺執行緒每隔一段時間會把臟頁的多個修改重繪到磁盤上,這個動作叫做「刷臟」,

3. redo日志

3.1 為什么需要redo日志

不定時刷臟又帶來一個問題,如果臟頁的資料還沒有重繪到磁盤上,此時資料庫突然宕機或重啟,這些資料就會丟失,

首先想到的最簡單粗暴的解決方案就是在事務提交之前,把該事務修改的所有頁面都重繪到磁盤,但是上文說過,頁是記憶體和磁盤互動的最小單位,如果只修改了1個位元組,卻要重繪16KB的資料到磁盤上,不得不說太浪費了,此路不通!

所以,必須要有一個持久化的措施,

為了解決這個問題,InnoDB把對所有頁的更新操作(再強調一遍,包含INSERT、UPDATE、DELETE)專門寫入一個日志檔案,

當有未同步到磁盤中的資料時,資料庫在啟動的時候,會根據這個日志檔案進行資料恢復,我們常說的關系型資料庫的ACID特性中的D(持久性),就是通過這個日志來實作的,

這個日志檔案就是大名鼎鼎的redo日志

「re」在英文中的詞根含義是“重新”,redo就是「重新做」的意思,顧名思義就是MySQL根據這個日志檔案重新進行操作

image-20220204090209073

這就出現了一個有意思的問題,重繪磁盤和寫redo日志都是進行磁盤操作,為什么不直接把資料重繪到磁盤中呢?

3.2 磁道尋址

我們需要稍微了解一下磁道尋址的程序,磁盤的構造如下圖所示,

image-20220204122927626

每個硬碟都有若干個盤片,上圖的硬碟有4個盤片,

每個盤片的盤面上有一圈圈的同心圓,叫做「磁道」,

從圓心向外畫直線,可以將磁道劃分為若干個弧段,每個磁道上一個弧段被稱之為一個「扇區」(右上圖白色部分),資料是保存在扇區當中的,扇區是硬碟讀寫的最小單元,如果要讀寫資料,必須找到對應的扇區,這個程序叫做「尋址」,

3.2.1 隨機I/O

如果我們需要的資料是隨機分散在磁盤上不同盤片的不同扇區中,那么找到相應的資料需要等到磁臂旋轉到指定的盤片然后繼續尋找對應的扇區,才能找到我們所需要的一塊資料,持續進行此程序直到找完所有資料,這個就是隨機I/O,讀取資料速度非常慢,

3.2.2 順序I/O

假設我們已經找到了第一塊資料,并且其他所需的資料就在這一塊資料之后,那么就不需要重新尋址,可以依次拿到我們所需的資料,這個就叫順序 I/O,

現在回答之前的問題,因為刷臟是隨機I/O,而記錄日志是順序I/O(連續寫的),順序I/O效率更高,本質上是資料集中存盤和分散存盤的區別,因此先把修改寫入日志檔案,在保證了記憶體資料的安全性的情況下,可以延遲刷盤時機,進而提升系統吞吐,

3.3 redo日志的系統變數

redo日志位于MySQL資料目錄下,默認有ib_logfile0ib_logfile1兩個檔案,如下圖所示,

image-20220204213439921

可以發現,兩個redo日志檔案的大小都是50331648,默認48MB,為什么這個大小是固定的呢?因為如果我們要使用順序I/O,就必須在申請磁盤空間的時候一次性決定申請的空間大小,這樣才能保證申請的磁盤空間在地址上的連續性,

這也就決定了redo日志的舊資料會被覆寫,一旦檔案被寫滿,就會觸發Buffer Pool臟頁到磁盤的同步,以騰出額外空間記錄后面的修改,

可以通過以下指令查看redo日志的系統屬性,

mysql> show variables like 'innodb_log%';
+-----------------------------+----------+
| Variable_name               | Value    |
+-----------------------------+----------+
| innodb_log_buffer_size      | 16777216 |
| innodb_log_checksums        | ON       |
| innodb_log_compressed_pages | ON       |
| innodb_log_file_size        | 50331648 |
| innodb_log_files_in_group   | 2        |
| innodb_log_group_home_dir   | ./       |
| innodb_log_write_ahead_size | 8192     |
+-----------------------------+----------+
引數名稱 含義
innodb_log_file_size 指定每個redo日志檔案的大小,默認48MB
innodb_log_files_in_group 指定redo日志檔案的數量,默認2
innodb_log_group_home_dir 指定redo檔案的路徑,如果不指定,則默認為datadir目錄

介紹到這里,讀者朋友可以發現,我們剛才探索的是如何讓已經提交的事務保持持久化,但是如果某些事務偏偏在執行到一半的時候出現問題怎么辦?

事務的原子性要求事務中的所有操作要么都成功,要么都失敗,不允許存在中間狀態,就好比我在寫這篇文章的時候,會時不時地敲一下ctrl+Z回傳到上一步或者過去好幾步之前的狀態,MySQL也需要“留一手”,把事務回滾時需要的東西都記錄下來,

比如,插入資料的時候,至少應該把新增的這條記錄的主鍵的值記錄下來,這樣回滾的時候只要把這個主鍵值對應的記錄洗掉就可以了,

MySQL又一個鼎鼎大名的日志——undo日志,正式登場!

4. undo日志

undo log(撤銷日志或回滾日志)記錄了事務發生之前的資料狀態,分為insert undo log和update undo log,

如果修改資料時出現例外,可以用 undo log來實作回滾操作(保持原子性),可以理解為undo日志記錄的是反向的操作,比如INSERT操作會記錄DELETE,UPDATE會記錄UPDATE之前的值,和redo日志記錄在哪個物理頁面做了什么操作不同,所以這是一種邏輯格式的日志,

undo日志和redo日志與事務密切相關,被統稱為「事務日志」,

image-20220205122803785

關于undo日志,我們目前只需要了解這么多即可

5. SQL更新陳述句的執行總結——初版

有了事務日志之后,我們來簡單總結一下更新操作的流程,這是一個簡化的程序,

name 原值是chanmufeng

update t_user_innodb set name ='chanmufeng1994' where id = 1;
  1. 事務開始,從記憶體(Buffer Pool)或磁盤取到包含這條資料的資料頁,回傳給 Server 的執行器;
  2. Server 的執行器修改資料頁的這一行資料的值為 chanmufeng1994;
  3. 記錄 name=chanmufeng 到undo log;
  4. 記錄 name=chanmufeng1994到redo log;
  5. 呼叫存盤引擎介面,記錄資料頁到Buffer Pool(修改 name=penyuyan);
  6. 事務提交,

6. binlog日志

之前我們講過,從MySQL整體架構來看,其實可以分成兩部分

  • Server 層,它主要做的是 MySQL功能層面的事情,比如處理連接、決議優化等;
  • 存盤引擎層,負責存盤相關的具體事宜,

redo日志是InnoDB存盤引擎特有的日志,而Server層也有自己的日志,稱為 binlog(歸檔日志),它可以被所有存盤引擎使用,

6.1 為什么有了redo日志還需要 binlog?

我想你可能會問出這個問題,實際上,更準確的問法是為什么有了binlog還需要有redo日志?主要有以下幾個原因,

  1. 因為最開始MySQL里并沒有InnoDB存盤引擎,MySQL自帶的引擎是MyISAM,但是 MyISAM沒有崩潰恢復的能力,InnoDB后來以插件的形式被引入,順便帶來了redo日志;

  2. binlog日志是用來歸檔的,binlog以事件的形式記錄了所有的 DDL和 DML 陳述句(因為它記錄的是操作而不是
    資料值,屬于邏輯日志),但是不具備宕機恢復的功能,因為可能沒有來得及重繪臟頁,造成臟頁資料的丟失,而這些操作也沒有保存到binlog中從而造成資料丟失;

  3. binlog記錄的是關于一個事務的具體操作內容,即該日志是邏輯日志,而redo日志記錄的是關于每個頁的更改的物理情況,功能壓根不是一回事兒,

6.2 binlog日志的作用

6.2.1 主從復制

binlog是實作MySQL主從復制功能的核心組件,

master節點會將所有的寫操作記錄到binlog中,slave節點會有專門的I/O執行緒讀取master節點的binlog,將寫操作同步到當前所在的slave節點,

image-20220205111635571

6.2.2 資料恢復

假如你在閱讀這篇文章的時候覺得我寫得實在太好,拍案叫絕的時候一不小心把公司的資料庫給刪了,你該怎么做才能恢復到你刪庫之前的那個時刻的狀態?

這個時候就要用到binlog了,前提是binlog沒有被洗掉,否則,神仙也救不了你了,

通常情況下,公司會定期對資料庫進行全量備份,可能隔一個月,一周,甚至可能每天都備份一次,運氣好的話你可以使用前一天的全量備份,恢復到前一天的某時刻狀態(或者一周、一月之前),然后從全量備份的時刻開始,從binlog中提取該時刻之后(前提是你的binlog里面存放了這段時間的日志)的所有寫操作(當然,你得過濾掉你的刪庫操作),然后進行操作回放就可以了,

是不是很簡單?

問題又來了,再看一眼我們的更新陳述句,

update t_user_innodb set name ='chanmufeng1994' where id = 1;

假如這條更新陳述句已經被寫入到了redo日志,還沒來得及寫binlog的時候,MySQL宕機重啟了,我們看一下會發生什么,

因為redo日志可以在重啟的時候用于恢復資料,所以寫入磁盤的是chanmufeng1994,但是binlog里面沒有記錄這個邏輯日志,所以這時候用binlog去恢復資料或者同步到從庫,就會出現資料不一致的情況,

所以在寫兩個日志的情況下,就類似于「分布式事務」的情況,如果你不清楚分布式事務是個什么東西也沒關系,我在之后的文章會介紹到,能夠明確的就是redo日志和binlog日志如果單純依次進行提交是無法保證兩種日志都寫成功或者都寫失敗的,

我們需要「兩階段提交」,

6.3 兩階段提交

兩階段提交不是MySQL的專利,兩階段提交是一種跨系統維持資料邏輯一致性的常見方案,尤其在分布式事務上,所以請讀者重點體會思想

我們把redo日志的提交分成兩步,兩步中redo日志的狀態分別是preparecommit,步驟如下

  1. InnoDB存盤引擎將更改更新到記憶體中后,同時將這個更新操作記錄到redo日志里面,此時redo日志處于prepare狀態;

  2. 執行器生成這個操作的binlog,并將binlog刷盤;

  3. 執行器呼叫InnoDB的提交事務介面,InnoDB把剛剛寫入的redo日志改成commit狀態,至此,所有操作完成,

image-20220205154320275

加上兩階段提交之后我們再來看一下SQL更新陳述句的執行流程,

7. SQL更新陳述句的執行總結——終版

image-20220205170459424

  1. 客戶端發送更新命令到MySQL服務器,經過處理連接、決議優化等步驟;
  2. Server層向InnoDB存盤引擎要id=1的這條記錄;
  3. 存盤引擎先從快取中查找這條記錄,有的話直接回傳,沒有則從磁盤加載到快取中然后回傳;
  4. Server層執行器修改這條記錄的name欄位值;
  5. 存盤引擎更新修改到記憶體中;
  6. 存盤引擎記錄redo日志,并將狀態設定為prepare狀態;
  7. 存盤引擎通知執行器,修改完畢,可以進行事務提交;
  8. Server先寫了個binlog;
  9. Server提交事務;
  10. 存盤引擎將redo日志中和當前事務相關的記錄狀態設定為commit狀態,

完!

推薦閱讀

  • 一條SQL查詢陳述句是如何執行的

參考資料

  1. MySQL實戰45講

  2. MySQL是怎樣運行的

轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/423385.html

標籤:MySQL

上一篇:MySQL45講-2-一條SQL更新陳述句是如何執行的?

下一篇:MSSQL·CONVERT轉換某欄位無效果

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • GPU虛擬機創建時間深度優化

    **?桔妹導讀:**GPU虛擬機實體創建速度慢是公有云面臨的普遍問題,由于通常情況下創建虛擬機屬于低頻操作而未引起業界的重視,實際生產中還是存在對GPU實體創建時間有苛刻要求的業務場景。本文將介紹滴滴云在解決該問題時的思路、方法、并展示最終的優化成果。 從公有云服務商那里購買過虛擬主機的資深用戶,一 ......

    uj5u.com 2020-09-10 06:09:13 more
  • 可編程網卡芯片在滴滴云網路的應用實踐

    **?桔妹導讀:**隨著云規模不斷擴大以及業務層面對延遲、帶寬的要求越來越高,采用DPDK 加速網路報文處理的方式在橫向縱向擴展都出現了局限性。可編程芯片成為業界熱點。本文主要講述了可編程網卡芯片在滴滴云網路中的應用實踐,遇到的問題、帶來的收益以及開源社區貢獻。 #1. 資料中心面臨的問題 隨著滴滴 ......

    uj5u.com 2020-09-10 06:10:21 more
  • 滴滴資料通道服務演進之路

    **?桔妹導讀:**滴滴資料通道引擎承載著全公司的資料同步,為下游實時和離線場景提供了必不可少的源資料。隨著任務量的不斷增加,資料通道的整體架構也隨之發生改變。本文介紹了滴滴資料通道的發展歷程,遇到的問題以及今后的規劃。 #1. 背景 資料,對于任何一家互聯網公司來說都是非常重要的資產,公司的大資料 ......

    uj5u.com 2020-09-10 06:11:05 more
  • 滴滴AI Labs斬獲國際機器翻譯大賽中譯英方向世界第三

    **桔妹導讀:**深耕人工智能領域,致力于探索AI讓出行更美好的滴滴AI Labs再次斬獲國際大獎,這次獲獎的專案是什么呢?一起來看看詳細報道吧! 近日,由國際計算語言學協會ACL(The Association for Computational Linguistics)舉辦的世界最具影響力的機器 ......

    uj5u.com 2020-09-10 06:11:29 more
  • MPP (Massively Parallel Processing)大規模并行處理

    1、什么是mpp? MPP (Massively Parallel Processing),即大規模并行處理,在資料庫非共享集群中,每個節點都有獨立的磁盤存盤系統和記憶體系統,業務資料根據資料庫模型和應用特點劃分到各個節點上,每臺資料節點通過專用網路或者商業通用網路互相連接,彼此協同計算,作為整體提供 ......

    uj5u.com 2020-09-10 06:11:41 more
  • 滴滴資料倉庫指標體系建設實踐

    **桔妹導讀:**指標體系是什么?如何使用OSM模型和AARRR模型搭建指標體系?如何統一流程、規范化、工具化管理指標體系?本文會對建設的方法論結合滴滴資料指標體系建設實踐進行解答分析。 #1. 什么是指標體系 ##1.1 指標體系定義 指標體系是將零散單點的具有相互聯系的指標,系統化的組織起來,通 ......

    uj5u.com 2020-09-10 06:12:52 more
  • 單表千萬行資料庫 LIKE 搜索優化手記

    我們經常在資料庫中使用 LIKE 運算子來完成對資料的模糊搜索,LIKE 運算子用于在 WHERE 子句中搜索列中的指定模式。 如果需要查找客戶表中所有姓氏是“張”的資料,可以使用下面的 SQL 陳述句: SELECT * FROM Customer WHERE Name LIKE '張%' 如果需要 ......

    uj5u.com 2020-09-10 06:13:25 more
  • 滴滴Ceph分布式存盤系統優化之鎖優化

    **桔妹導讀:**Ceph是國際知名的開源分布式存盤系統,在工業界和學術界都有著重要的影響。Ceph的架構和演算法設計發表在國際系統領域頂級會議OSDI、SOSP、SC等上。Ceph社區得到Red Hat、SUSE、Intel等大公司的大力支持。Ceph是國際云計算領域應用最廣泛的開源分布式存盤系統, ......

    uj5u.com 2020-09-10 06:14:51 more
  • es~通過ElasticsearchTemplate進行聚合~嵌套聚合

    之前寫過《es~通過ElasticsearchTemplate進行聚合操作》的文章,這一次主要寫一個嵌套的聚合,例如先對sex集合,再對desc聚合,最后再對age求和,共三層嵌套。 Aggregations的部分特性類似于SQL語言中的group by,avg,sum等函式,Aggregation ......

    uj5u.com 2020-09-10 06:14:59 more
  • 爬蟲日志監控 -- Elastc Stack(ELK)部署

    傻瓜式部署,只需替換IP與用戶 導讀: 現ELK四大組件分別為:Elasticsearch(核心)、logstash(處理)、filebeat(采集)、kibana(可視化) 下載均在https://www.elastic.co/cn/downloads/下tar包,各組件版本最好一致,配合fdm會 ......

    uj5u.com 2020-09-10 06:15:05 more
最新发布
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:33:24 more
  • MySQL中binlog備份腳本分享

    關于MySQL的二進制日志(binlog),我們都知道二進制日志(binlog)非常重要,尤其當你需要point to point災難恢復的時侯,所以我們要對其進行備份。關于二進制日志(binlog)的備份,可以基于flush logs方式先切換binlog,然后拷貝&壓縮到到遠程服務器或本地服務器 ......

    uj5u.com 2023-04-20 08:28:06 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:27:27 more
  • 快取與資料庫雙寫一致性幾種策略分析

    本文將對幾種快取與資料庫保證資料一致性的使用方式進行分析。為保證高并發性能,以下分析場景不考慮執行的原子性及加鎖等強一致性要求的場景,僅追求最終一致性。 ......

    uj5u.com 2023-04-20 08:26:48 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:26:35 more
  • 云時代,MySQL到ClickHouse資料同步產品對比推薦

    ClickHouse 在執行分析查詢時的速度優勢很好的彌補了MySQL的不足,但是對于很多開發者和DBA來說,如何將MySQL穩定、高效、簡單的同步到 ClickHouse 卻很困難。本文對比了 NineData、MaterializeMySQL(ClickHouse自帶)、Bifrost 三款產品... ......

    uj5u.com 2023-04-20 08:26:29 more
  • sql陳述句優化

    問題查找及措施 問題查找 需要找到具體的代碼,對其進行一對一優化,而非一直把關注點放在服務器和sql平臺 降低簡化每個事務中處理的問題,盡量不要讓一個事務拖太長的時間 例如檔案上傳時,應將檔案上傳這一步放在事務外面 微軟建議 4.啟動sql定時執行計劃 怎么啟動sqlserver代理服務-百度經驗 ......

    uj5u.com 2023-04-20 08:25:13 more
  • Redis 報”OutOfDirectMemoryError“(堆外記憶體溢位)

    Redis 報錯“OutOfDirectMemoryError(堆外記憶體溢位) ”問題如下: 一、報錯資訊: 使用 Redis 的業務介面 ,產生 OutOfDirectMemoryError(堆外記憶體溢位),如圖: 格式化后的報錯資訊: { "timestamp": "2023-04-17 22: ......

    uj5u.com 2023-04-20 08:24:54 more
  • day02-2-商鋪查詢快取

    功能02-商鋪查詢快取 3.商鋪詳情快取查詢 3.1什么是快取? 快取就是資料交換的緩沖區(稱作Cache),是存盤資料的臨時地方,一般讀寫性能較高。 快取的作用: 降低后端負載 提高讀寫效率,降低回應時間 快取的成本: 資料一致性成本 代碼維護成本 運維成本 3.2需求說明 如下,當我們點擊商店詳 ......

    uj5u.com 2023-04-20 08:24:03 more
  • day02-短信登錄

    功能實作02 2.功能01-短信登錄 2.1基于Session實作登錄 2.1.1思路分析 2.1.2代碼實作 2.1.2.1發送短信驗證碼 發送短信驗證碼: 發送驗證碼的介面為:http://127.0.0.1:8080/api/user/code?phone=xxxxx<手機號> 請求方式:PO ......

    uj5u.com 2023-04-20 08:23:11 more