學習心得分享

我認為知識是一定要系統化的學習,結構化梳理,這樣在運用或思考的時候,能夠回憶起自己在這一塊梳理的知識結構,如果有記錄那么能快速回憶并理解,如果沒有記錄,那么說明對自己來說超綱了,把知識進行分類,寫入自己的知識庫,那就對知識點有了一個快速的定位和理解。能夠梳理清晰自己所學的知識,并定位知識點。這就是我認為系統化知識的意義。

我在學習過程中發現,我自己的思維方式和理解方式,想要學會和理解一個知識點,使用它是最快的方式,將這個知識點實戰一次,就基本知道了這東西的作用。

  • 使用層面

1)起步入門:粗讀是什么?有什么用?解決了什么問題? 怎么用?(來一個快速實戰,上手做一做)

2)運用核心功能:也是基礎功能、核心知識點,學習運用功能以及掌握核心知識為主。

3)最佳實踐:核心知識要實踐,知識運用有無數種方式,最佳實踐能避免錯誤的運用知識。理論是在原理層面指導實踐。如果有最佳實踐的總結,那便是最好的理論。比如:【關系型數據庫設計理論】就是指導如何設計出高質量的關系型數據庫。

4)小總結:技術優缺點,適用場景。

學到這里,我可以說我會用 CRUD 了。

當然僅僅會用是不夠的,要想用的好、用的靈活,必須要知道它的內部結構和工作原理,比如MySQL ,如果僅僅停留在使用層面,那可能只會CRUD, 如果深入學習了MySQL 內部是B+樹索引,二級索引等,那么在創建表時會酌情新增索引,畢竟每新增一個索引就要創建一棵新的B+樹,另外在查詢表的時候知道如何利用索引高效查詢,如果了解MySQL內部有redo log ,DoubleWrtie pool , 就不那么擔心 SQL 語句執行過程中斷電的問題。知道了 buffer pool ,就明白 InnoDB 是由緩存的,緩存優先存儲最常用的數據,這可能為編寫SQL 帶來一些便利,不過學習到最后明白了 MySQL 調優有限,不如 redis 或者業務優化來的更快更高效。

這便是深入學習和僅僅停留在使用層面的不同之處,我們想要用好一個技術,自然是要學習技術內部原理,明白技術內部是如何工作的,這就是我最喜歡的兩個學習思維,學習技術內部層次結構工作流程,這兩個方面弄明白了,思維就通暢了。

以今天學到的 MySQL 為例,看看內部層次結構工作流程。直接上圖了

這是通用關系型數據庫的內部結構圖

這是MySQL 內部結構圖

這是 InnoDB 內部存儲結構圖

畫出了這三張圖,我基本上了解 MySQL 內部結構的全貌,當然以上的圖并沒有畫出 MySQL 的所有結構,所有的部分,隨著我對 MySQL 知識面的擴展,我會繼續追加,這些圖有助于我定位正在學習知識點屬于 MySQL 結構的哪一個部分。比如 Doublewrite buffer, 將它定位到結構中,看三分鐘文檔我就理解了。

我另一個熱愛的學習方式是工作流程,看看這玩意是咋工作的,就能把內部結構串起來,理解MySQL 各個結構的作用。當然它的工作流程不止一種,不同情況會有不同的工作流程,可能很多很復雜。不過我們先掌握正常運轉的工作流程,意外情況掌握幾個經典的~

再拿 MySQL 舉例,我們來看看工作原理:

左邊紅色的塊是 Java 程序,集成了 MYSQL 驅動并且引用線程池,避免頻繁創建和銷毀連接帶來的損耗。

中間是發送網絡請求,java 應用發送的 SQL 語句的請求在 MySQL 中是由一個個的線程去處理的。

那么可以得出, 一個 SQL 請求會產生 兩個活躍的線程:一個在 Java 應用側等待/處理結果,一個在 MySQL 側執行 SQL。 注意不是占用哈,占用的意思是拿著不放,活躍的線程是可以調度,切換,阻塞。

右邊是MySQL 數據庫,同樣用一個連接池接收 SQL 請求,線程讀取網絡請求后在MySQL內部執行。

Java 程序通過網絡請求將 SQL 語句字符串發送給 MySQL 服務后,我們看看MySQL 服務內部怎么處理。

1. MYSQL 處理請求流程

  • SQL 接口:MySQL 中處理請求的線程在獲取到請求以后獲取 SQL 語句去交給 SQL 接口去處理。
  • SQL 解析器:他會將 SQL 接口傳遞過來的 SQL 語句進行解析,翻譯成 MySQL 自己能認識的語言
  • SQL 優化器:MySQL 會幫我去使用他自己認為的最好的方式去優化這條 SQL 語句,并生成一條條的執行計劃
  • 存儲引擎:查詢優化器會調用存儲引擎的接口,去執行 SQL,也就是說真正執行 SQL 的動作是在存儲引擎中完成的。
  • 執行器:前面那些組件的操作最終必須通過執行器去調用存儲引擎接口才能被執行

接下來看看存儲引擎做了什么!

2. 存儲引擎執行 SQL 流程

1)Buffer Pool (緩沖池)是 InnoDB 存儲引擎中非常重要的內存結構, InnoDB 級別的緩存。緩沖池中的數據和數據庫(磁盤)中的數據不一致時候,我們就認為緩存中的數據是臟數據

2)undo 日志文件:記錄數據被修改前的樣子,事務回滾時發揮作用。我們程序是正常運作,這里僅僅記錄。

3)redo 日志文件:記錄數據被修改后的樣子,redo 日志文件是 InnoDB 特有的,他是存儲引擎級別的,不是 MySQL 級別的,緩存池更新后記錄到緩存日志中,緩存日志默認是立刻寫入磁盤。緩存池數據是延遲。

InnoDB 目前整體執行流程:

  • 準備更新一條 SQL 語句
  • MySQL(innodb)會先去緩沖池(BufferPool)中去查找這條數據,沒找到就會去磁盤中查找,如果查找到就會將這條數據加載到緩沖池(BufferPool)中
  • 在加載到 Buffer Pool 的同時,會將這條數據的原始記錄保存到 undo 日志文件中
  • innodb 會在 Buffer Pool 中執行更新操作
  • 更新后的數據會記錄在 redo log buffer 中
  • MySQL 提交事務的時候,會將 redo log buffer 中的數據寫入到 redo 日志文件中 刷磁盤可以通過 innodb_flush_log_at_trx_commit 參數來設置
    • 值為 0 表示不刷入磁盤
    • 值為 1 表示立即刷入磁盤
    • 值為 2 表示先刷到 os cache
  • myslq 重啟的時候會將 redo 日志恢復到緩沖池中

4) binlog : 記錄整個操作過程,bin log 通過追加的方式記錄,當文件大小大于給定值后,后續的日志會記錄到新的文件上,bin log 適用于主從復制和數據恢復。

bin log 刷盤有三種模式

  • STATMENT :基于 SQL 語句的復制(statement-based replication, SBR),每一條會修改數據的 SQL 語句會記錄到 bin log 中
  • ROW:基于行的復制(row-based replication, RBR),不記錄每條SQL語句的上下文信息,僅需記錄哪條數據被修改了
  • MIXED:基于 STATMENT 和 ROW 兩種模式的混合復制( mixed-based replication, MBR ),一般的復制使用 STATEMENT 模式保存 bin log ,對于 STATEMENT 模式無法復制的操作使用 ROW 模式保存 bin log

5) MySQL 會有一個后臺線程,它會在某個時機從 Buffer Pool 中挑選出臟數據刷到 MySQL 數據庫中

如果在數據被寫入到bin log文件的時候,剛寫完,數據庫宕機了,數據會丟失嗎?

首先可以確定的是,只要redo log最后沒有 commit 標記,說明本次的事務一定是失敗的。但是數據是沒有丟失了,因為已經被記錄到redo log的磁盤文件中了。在 MySQL 重啟的時候,就會將 redo log 中的數據恢復(加載)到Buffer Pool中。

最后返回到查詢執行器,經過封裝后發回給調用的客戶端。

從這兩個角度學習新技術,基本上就能掌握技術,但是并不能掌握高級使用場景,比如知道了MySQL 以上內容,當碰到主從復制,讀寫分離、分庫分表的場景還是手足無措。這些都屬于MySQL的優化,一門技術核心功能掌握了,肯定要想還能怎么優化,優化到上限是什么?優化的代價又是什么?

當使用分庫分表,比如將數據庫做了一個水平分庫,把一個庫分成多個庫,這樣的數據存在多個數據庫中,在高并發場景下,對多個數據庫讀寫肯定比對一個庫讀寫要快不少,做了一個性能優化,這是一種 MySQL 的高階使用。

分庫的代價是什么呢?

此時思維要切換到管理多個數據庫帶來了什么麻煩?

我們都知道 SQL 語句是在數據庫中執行的,也就是說 SQL 中的 Order By 排序僅僅是對于單個數據庫排序,而我的數據庫有多個,這并不算是對我系統的全部數據排序。

另外還有 count(*) , START TRANSACTION 都會出現這種情況。這是第一個代價,管理數據庫變得更復雜。

第二個代價,要把思維切換到存儲數據層面,你能想到什么?

ID 要保持唯一性,多個數據庫就有可能發生 ID 重復,那么 ID 失去了唯一性還能叫 ID 嗎?根據一個ID 查出兩個人這合理嗎?我不希望有人跟我的身份證同號呀,可想而知這個問題會帶來多少麻煩。

問題的解決辦法不加以探索了,我要學習一些更核心的知識,畢竟我還是太菜了。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/95765.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/95765.shtml
英文地址,請注明出處:http://en.pswp.cn/web/95765.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

為什么說 Linode 和 DigitalOcean 的差距,不止于 VPS?

在今天這個全球化的商業戰場上,中國企業的出海已從“選擇題”變為“必答題”。當我們滿懷雄心,將產品和業務推向海外市場時,基礎設施的選擇,往往是決定成敗的第一步。它不僅關乎成本與性能,更直接影響著團隊的開發效率…

NSSCTF每日一題_Web_[SWPUCTF 2022 新生賽]奇妙的MD5

為了保持做題的感覺和持續學習,也就有了每日一題系列,選一些有意義的題目或者一些CTF新穎題目作為參考學習。[SWPUCTF 2022 新生賽]奇妙的MD51. 訪問首頁界面并進行分析估計題目MD5提示,查詢得知ffifdyop 這個字符串是一個奇妙的MD5字符串因為將“ffifdy…

服務器IP暴露被攻擊了怎么辦?

當服務器IP暴露后,可能會面臨各種網絡攻擊,如DDoS攻擊、端口掃描、惡意入侵等,這將嚴重影響服務器的正常運行和數據安全。本文將從檢測攻擊類型、采取緊急防護措施、優化服務器配置、尋求專業支持以及預防未來攻擊五個方面,詳細探…

TDengine 時間函數 TIMETRUNCATE 用戶手冊

TDengine TIMETRUNCATE 函數用戶使用手冊 函數概述 TIMETRUNCATE 是 TDengine 中的一個時間處理標量函數,用于將時間戳按照指定的時間單位進行截斷操作。該函數在時間數據聚合、分組和統計分析中非常有用,特別適用于智能電表等時序數據的分析場景。 語…

Linux電腦怎樣投屏到客廳的大電視?支持遠程投屏嗎?

一般的電腦投屏軟件都會推出Windows版本和macOS版本,雖然這兩個版本已經覆蓋大部分消費者的常用電腦,但是依然有一部分群體因為電腦系統版本問題不能使用投屏軟件。 如果你當前使用的是Linux系統的電腦,而且又要將電腦投屏投屏到客廳的大電視…

MP4視頻太大如何壓縮?分享6種簡單便捷的壓縮小技巧

隨著拍攝高清視頻的設備越來越多,我們經常會遇到MP4視頻文件體積過大的問題,無論是上傳到社交平臺、發送給朋友,還是存儲在設備中,過大的視頻文件都會帶來諸多不便。那么,MP4視頻太大怎么壓縮呢?本文將介紹…

k8s 部署 redis

創建部署文件 vim redis.yaml添加如下內容: apiVersion: v1 kind: Namespace metadata:name: redis --- apiVersion: v1 kind: Secret metadata:name: redis-passwordnamespace: redis type: Opaque data:password: d2d3cmhnZWE # 建議生產環境使用更復雜的密碼 ---…

FFMPEG H264

一、H264壓縮編碼1.1 H264 中的 I 幀、P幀和 B幀H264 使用幀內壓縮和幀間壓縮的方式提高編碼壓縮率;H264 采用了獨特的 I 幀、P 幀和 B 幀策略來實現,連續幀之間的壓縮;1.2 其他概念GOP(圖像組):一個IDR幀到…

Unity 解決天空盒中間出現一條線

問題解決找到天空盒對應貼圖,在Inspector 面板中找到Advanced →Generate Mip Maps 并取消勾選即可。效果動態修改天空盒RenderSettings.skybox targetSkyboxMaterial; DynamicGI.UpdateEnvironment();

Python爬蟲實戰:研究Showcase模塊,構建電商平臺銷售數據采集和分析系統

1. 引言 1.1 研究背景 在數字經濟快速發展的今天,電商平臺積累了海量的商品信息、交易數據和用戶反饋,這些數據蘊含著豐富的市場洞察。根據中國電子商務研究中心數據,2024 年我國網絡零售市場規模突破 15 萬億元,平臺商品數據呈現指數級增長。如何高效提取這些數據并轉化…

C++中的Reactor和Proactor模型進行系統性解析

<摘要> 本解析系統闡述了網絡編程中Reactor與Proactor兩種高性能I/O模型的核心概念。Reactor基于同步I/O多路復用&#xff0c;通過事件循環分發通知&#xff0c;由應用層自行完成I/O操作&#xff1b;而Proactor則基于異步I/O&#xff0c;由操作系統完成I/O操作后主動回調…

【技術教程】如何將文檔編輯器集成至基于Node.js的網頁應用程序中

當今數字化時代&#xff0c;Web應用對在線文檔編輯的需求日益增長。無論是構建在線辦公系統、內容管理平臺還是協作工具&#xff0c;讓用戶能夠直接在瀏覽器中編輯和處理文檔已成為基本需求。 想知道如何為你的 Node.js 應用添加強大的在線文檔編輯功能嗎&#xff1f;本文手把…

[論文閱讀] 人工智能 + 軟件工程 | 別讓AI寫的代碼帶“漏洞”!無觸發投毒攻擊的防御困境與啟示

別讓AI寫的代碼帶“漏洞”&#xff01;無觸發投毒攻擊的防御困境與啟示 論文信息 原標題&#xff1a;Evaluating Defenses Against Trigger-Free Data Poisoning Attacks on NL-to-Code Models&#xff08;評估NL-to-Code模型應對無觸發數據投毒攻擊的防御方法&#xff09;主要…

【Windows】通過 runas 命令實現多用戶權限測試的完整流程

? 目錄 ?&#x1f6eb; 導讀需求1?? 前期準備&#xff1a;創建管理員/普通測試用戶1.1 創建普通用戶Test&#xff08;無管理員權限&#xff09;1.2 創建管理員用戶Admin&#xff08;含管理員權限&#xff09;2?? 核心操作&#xff1a;通過runas命令切換用戶命令行環境2.1…

新后端漏洞(上)- H2 Database Console 未授權訪問

漏洞介紹&#xff1a; H2 database是一款Java內存數據庫&#xff0c;多用于單元測試。 H2 database自帶一個Web管理頁面&#xff0c;在Spirng開發中&#xff0c;如果我們設置如下選項&#xff0c;即可允許外部用戶訪問Web管理頁面&#xff0c;且沒有鑒權&#xff1a; spring.h2…

2025-09-04 HTML3——區塊布局與表單

文章目錄1 塊元素與行內元素1.1 塊元素 (Block-level Element)1.2 行內元素 (Inline Element)2 HTML 布局2.1 使用 <div> 元素2.2 使用 <table> 元素3 表單 (<form>)3.1 輸入域&#xff08;<input>&#xff09;3.1.1 文本域&#xff08;Text Fields&am…

云數據庫服務(參考自騰訊云計算工程師認證課程)更新中......

數據庫基礎介紹面臨的挑戰&#xff1a;數據庫系統架構&#xff1a; 數據庫DB、數據庫管理系統DBMS&#xff08;負責數據庫的搭建、使用和維護的系統軟件&#xff0c;通過組織、索引、查詢、修改數據庫文件、實現數據定義、組織、存儲、管理以及數據庫操作、運行和維護等主要功能…

源滾滾AI編程SillyTavern酒館配置Claude Code API教程

什么是酒館 SillyTavern&#xff08;簡稱 ST&#xff09;是一款本地安裝的用戶界面&#xff0c;讓你能夠與文本生成大模型&#xff08;LLM&#xff09;、圖像生成引擎以及語音合成&#xff08;TTS&#xff09;模型進行交互。我們的目標是盡可能賦予用戶對 LLM 提示詞的最大掌控…

軟件設計師——軟件工程學習筆記

軟件工程 一、軟件工程基礎知識 1. 軟件的生存周期&#xff08;1&#xff09;可行性分析與項目開發計劃。這個階段主要確定軟件的開發目標及其可行性。參與該階段的人員有用戶、項目負責人、系統分析師。產生的文檔有 可行性分析報告、項目開發計劃。 &#xff08;2&#xff09…

阿里云ecs 2h2g 實際可用內存不足的情況

Kdump是Linux系統的一種內核崩潰轉儲機制&#xff0c;它允許在系統發生內核崩潰&#xff08;例如內核panic&#xff09;時&#xff0c;捕獲內存的轉儲信息&#xff0c;從而幫助事后分析故障原因。該過程需要一塊預留內存&#xff08;稱為crashkernel內存&#xff09;&#xff0…