mysql 一條語句的執行流程

文章目錄

    • 一條查詢語句的執行流程
      • 連接器
        • 管理連接
        • 權限校驗
      • 分析器
      • 優化器
        • 采樣統計
        • 優化器選錯索引改正
      • 執行器
      • 查詢緩存
      • 存儲引擎
    • 一條update語句的執行流程
      • redo log
        • redo log buffer結構
        • redo log日志類型
        • 寫入時機
        • 配置innodb_flush_log_at_trx_commit
      • binlog
        • redo log和binlog 對比
        • 配置
      • 兩階段提交協議
        • 崩潰時機

一條查詢語句的執行流程

在這里插入圖片描述

連接器

連接器:管理連接、權限校驗

管理連接

管理連接:由于連接成本高,連接池會復用連接。

成本高:TCP三次握手;發起系統調用;高并發場景可能耗盡文件資源描述符;

復用連接的問題(長連接問題):連接在斷開時才會釋放占用資源,而不是用完就釋放;長連接可能導致占用內存變大,比如大的查詢;長時間積累會導致mysql被系統殺掉OOM // 現象:mysql重啟

長連接問題解決方案:

  • 定期斷開連接
  • mysql_reset_connection 重置

空閑連接最大空閑時間:wait_timeout=default 8h

權限校驗

到權限表中查找擁有的權限;之后這個連接驗證的全局權限用的都是此時的權限快照;即使后續修改權限,也只會在新會話中生效,不會改變當前會話; // 但db權限修改了,就會生效,但如果進入了use db1;那修改了也不會改變use db1里的會話。

分析器

分析器:詞法分析、語法分析

詞法分析:檢查表、列是否存在;若列不存在,則返回報錯

語法分析:比如 elect * from t; 會報語法錯誤;錯誤會在use near后面

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

優化器

優化器:多條執行計劃成本對比,智能選擇索引

成本對比:對比CPU計算、內存消耗、大概掃描行數(采樣統計)、是否排序、是否使用臨時表等

采樣統計

一個索引上不同值(基數)越多,區分度越高;mysql通過采樣統計得到索引的基數;

innodb_status_persistent

on 持久化 N=20(采樣頁數)M=10(1/10個頁數變動就重新采樣)

off 僅存在內存 N=8 M=16

優化器選錯索引改正
  • 掃描行數不準:analyze table t修正
  • force index 強制修改索引
    • 問題:不優雅、維護字段變動就需要手動修改、遷移數據庫可能語句不兼容 // 主要就是關注變更的及時性
  • 修改sql語義
  • 業務思考,刪掉有影響的無效索引

執行器

執行前會判斷有無操作表的權限;在進優化器前會先precheck(粗檢查),執行器進行細檢查,比如視圖、存儲過程等復雜對象在precheck檢查不了。

存儲過程舉例:

delimiter ;;
create procedure idata()
begin...
end ;;
delimiter ;

走查詢緩存時,也會先查權限;

查詢緩存

失效頻繁:表更新時,所有查詢緩存都會被清空;更新壓力大的數據庫緩存命中率低;

查詢緩存適合靜態表,比如系統配置表;

存儲引擎

比如innodb,存儲引擎以插件的方式加入

一條update語句的執行流程

update t set c=c+1 where ID=2;

server層執行流程與select相同,下面主要介紹引擎層的執行流程 // 部分流程節點不在引擎中,比如binlog

在這里插入圖片描述

redo log

redo log buffer結構

redo log buffer類似go ring buffer, 是固定大小的環狀結構。write_pos是當前記錄的位置,write_pos到check_point的綠色部分還能寫入,其余位置是新的寫入。如果write_pos追上check_point,就需要先落盤,更新check_point的位置。// 此時落盤是prepare狀態的redo log

redo log一般有4GB,由4個1GB的文件組成。如果redo log設的太小,會出現磁盤壓力小,但數據庫出現間歇性的性能下跌,因為系統頻繁的中斷業務刷臟,更新check point位置

redo log日志類型

redo log是物理日志,記錄了數據頁的具體修改,比如哪一行的那個字段由啥改成啥;

redo log記錄的是操作,而不是數據本身,數據存在內存(buffer pool)和磁盤上;

寫入時機

redo log在修改數據前順序寫入,是WAL(Write Ahead Log),是崩潰恢復的重要保證機制;

redo log是順序寫入,比直接寫入磁盤更快(磁盤I/O慢、寫B+樹),降低了服務崩潰,數據丟失的風險。

配置innodb_flush_log_at_trx_commit

0:只寫到buffer中(內存緩存),等待定時刷新

1:事務提交時持久化到磁盤 // 推薦

2:會推到page cache中(os緩存),定時持久化

binlog

redo log怎么找到對應的binlog:有個xid,關聯他們。

mysql有全局變量global_query_id,每次執行語句會給它發一個query_id,然后把這個變量+1。如果這個語句是事務的第一條語句,就會把這個query_id給xid。每次sql重啟都會清空global_query_id 。

redo log和binlog 對比
redo logbinlog
物理日志邏輯日志,有三種格式,比如statement記錄的就是sql語句
innodb引擎特有,用于崩潰恢復mysql上的歸檔日志,主要用于主從復制
循環寫入順序追加記錄,追加寫不會覆蓋
配置

sync_binlog:

0:就寫到binlog buffer中,等待定時刷新

1:事務提交立即刷新 // 推薦

N:提交累積N個后刷新

兩階段提交協議

兩階段提交協議保證了redo log和binlog的一致性;

崩潰時機

在流程圖的時機A崩潰:redo log處于prepare狀態,未寫入binlog: 服務重新啟動時,認為事務提交失敗,回滾事務

在流程圖的時機B崩潰:redo log處于prepare狀態,寫入binlog完成:服務重新啟動時,認為事務提交成功,回放事務,將redo log prepare狀態改為commit

在流程圖的時機C崩潰: redo log若處于prepare狀態,同時機B;若處于commit狀態,則完成事務;

WAL保證了崩潰數據不丟失,prepare狀態的引入,保證了事務提交的一致性。

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

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

相關文章

【視頻觀看系統】- 需求分析

🎯 一、項目目標 構建一個功能完備的視頻觀看網站,用戶可以上傳、瀏覽、觀看視頻,并在觀看過程中實時發送/接收彈幕。系統具備良好的性能、可擴展性與用戶體驗,未來可逐步擴展為多媒體平臺。👤 二、用戶角色分析用戶類…

模型驅動的架構MDA的案例

在一個企業資源規劃(ERP)系統開發項目中,目標是為一家中型制造企業打造一套高效且可擴展的管理系統,涵蓋訂單處理、庫存管理等多個業務模塊。項目團隊采用了 MDA 的設計思想進行開發。?首先是業務需求分析與計算獨立模型&#xf…

第一次搭建數據庫

本文詳細介紹第一次搭建數據庫安裝和配置過程, 包括卸載舊版本、下載安裝、配置服務、環境變量等等 第一步下載mysql 在下載之前需要檢查電腦上有沒有安裝mysql, 如果有再安裝, 80%就會有問題 檢查方法: 電腦-右鍵找到管理-服務-在服務中找有沒有mysql服務若有請先 1.停止服務 …

洛谷題解 | UVA1485 Permutation Counting

目錄題目描述題目思路AC 代碼題目描述 https://onlinejudge.org/external/14/p1485.pdf 題目思路 dp。 定義 dpi,jdp_{i,j}dpi,j? 為前 iii 個數的排列中恰好有 jjj 個小于號的排列總數。 考慮將數字 iii 插入到前 i?1i-1i?1 個數的排列中不同的位置: 如果…

飛算科技:以原創技術賦能電商企業數字化轉型

在電商行業從流量競爭邁向精細化運營的當下,技術能力已成為決定企業生存與發展的核心要素。然而,高并發場景下的系統穩定性、個性化推薦算法的迭代效率、營銷活動的快速響應等挑戰,讓許多電商企業陷入“技術投入大、見效慢”的困境。作為國家…

人工智能自動化編程:傳統軟件開發vs AI驅動開發對比分析

人工智能自動化編程:傳統軟件開發vs AI驅動開發對比分析 🌟 嗨,我是IRpickstars! 🌌 總有一行代碼,能點亮萬千星辰。 🔍 在技術的宇宙中,我愿做永不停歇的探索者。 ? 用代碼丈量…

用java實現一個自定義基于logback的日志工具類

? 動態創建: 無需配置文件,通過代碼動態創建logback日志對象 ? Class對象支持: 使用LogUtil.getLogger(MyClass.class)的方式獲取日志 ? 日期格式文件: 自動生成info.%d{yyyy-MM-dd}.log格式的日志文件 ? 文件數量管理: 只保留最近3個文件,自動刪除歷…

面試現場:奇哥扮豬吃老虎,RocketMQ高級原理吊打面試官

“你了解RocketMQ的高級原理和源碼嗎?” 面試官推了推眼鏡,嘴角帶笑,眼神里透著一絲輕蔑。 奇哥笑而不語,開始表演。面試場景描寫 公司位于高樓林立的CBD,電梯直達28樓。面試室寬敞明亮,空氣中混著咖啡香與…

Django Nginx+uWSGI 安裝配置指南

Django Nginx+uWSGI 安裝配置指南 引言 Django 是一個高級的 Python Web 框架,用于快速開發和部署 Web 應用程序。Nginx 是一個高性能的 HTTP 和反向代理服務器,而 uWSGI 是一個 WSGI 服務器,用于處理 Python Web 應用。本文將詳細介紹如何在您的服務器上安裝和配置 Djang…

外設數據到昇騰310推理卡 之二dma_alloc_attrs

目錄 內核源碼及路徑 CONFIG_DMA_DECLARE_COHERENT DTS示例配置 dma_direct_alloc 特殊屬性快速路徑 (DMA_ATTR_NO_KERNEL_MAPPING) 主體流程 1. 內存分配核心 2. 地址轉換 3. 緩存一致性處理 映射 attrs不同屬性的cache處理 cache的標示(ARM64&#xff0…

Java 大視界:基于 Java 的大數據可視化在智慧城市能源消耗動態監測與優化決策中的應用(2025 實戰全景)

??摘要??在“雙碳”戰略深化落地的 2025 年,城市能源管理面臨 ??實時性??、??復雜性??、??可決策性?? 三重挑戰。本文提出基于 Java 技術棧的智慧能源管理平臺,融合 ??Flink 流處理引擎??、??Elasticsearch 實時檢索??、??ECh…

微信小程序控制空調之微信小程序篇

目錄 前言 下載微信開發者工具 一、項目簡述 核心功能 技術亮點 二、MQTT協議實現詳解 1. MQTT連接流程 2. 協議包結構實現 CONNECT包構建 PUBLISH包構建 三、核心功能實現 1. 智能重連機制 2. 溫度控制邏輯 3. 模式控制實現 四、調試系統實現 1. 調試信息收集…

spring boot 詳解以及原理

Spring Boot 是 Spring 框架的擴展,旨在簡化 Spring 應用的開發和部署。它通過自動配置和約定優于配置的原則,讓開發者能夠快速搭建獨立運行的、生產級別的 Spring 應用。以下是 Spring Boot 的詳細解析和工作原理: 一、Spring Boot 的核心特…

3.4 ASPICE的系統架構與設計過程

ASPICE(Automotive SPICE)在系統架構與設計過程中,強調了在汽車軟件開發中確保系統穩定性、可靠性和安全性的重要性。以下是ASPICE在系統架構與設計過程中的主要內容和步驟:系統架構設計準備階段:需求分析:…

自助KTV選址指南與優化策略

選址四大鐵律(硬性條件)產權合規:純商業產權消防雙通道:必須通過消防驗收遠離敏感區:距居民區、學校、醫院等200米以上面積達標:滿足包廂規劃需求選址核心邏輯(優先級排序)要素關鍵策…

深度學習11(調參設參+批標準化)

調參技巧對于調參,通常采用跟機器學習中介紹的網格搜索一致,讓所有參數的可能組合在一起,得到N組結果。然后去測試每一組的效果去選擇。 假設我們現在有兩個參數 α:0.1, 0.01, 0.001β:0.8, 0.88. 0.9這樣會有9種…

Python 中 enumerate(s) 和 range() 的對比

一、enumerate(s) 是什么?for i, c in enumerate(s):...enumerate(s) 是一個內置函數,用于在遍歷可迭代對象時,同時獲得元素的索引和值。它返回的是一個**(index, element)** 元組。常用于遍歷字符串、列表、元組等時,如果你既想拿…

【一起來學AI大模型】RAG系統流程:查詢→向量化→檢索→生成

RAG(Retrieval-Augmented Generation)系統核心流程非常精準: 查詢 → 向量化 → 檢索 → 生成 這是 RAG 實現“知識增強”的關鍵路徑。下面我們結合具體組件(如 ChromaDB、LangChain 檢索器)詳細拆解每個步驟&#xff…

圖像硬解碼和軟解碼

一、什么是圖像解碼? 圖像解碼是指將壓縮編碼(如 JPEG、PNG、WebP、H.264/AVC、H.265/HEVC 等格式)的圖像或視頻數據還原為原始像素數據(如 RGB、YUV)的過程。 解碼可以在CPU(軟件解碼)或專用硬…

Camera2API筆記

1. 常用對象CameraManager 相機服務。用于獲取相機對象和相機信息。CameraDevices 相機設備。負責連接相機、創建會話、生成拍攝請求,管理相機生命周期。CameraCaptureSession 相機拍攝會話。用于預覽和拍攝。一個相機只能有一個活躍會話。打開新會話時,…