Mysql數據庫進階

一、Mysql組織架構

連接層

1.驗證用戶的身份,用戶名密碼是否匹配
2.提供兩種連接方式(TCP/IP連接、socket連接)
3.連接層提供了一個與sql層交互的線程

SQL層

1.接收連接層傳過來的SQL語句
2.驗證執行的SQL語法
3.驗證SQL的語義(DDL,DML,DQL,DCL)
4.解析器:解析SQL語句,生成執行計劃
5.優化器:將解析器傳來的執行計劃選擇最優的一條執行
6.執行器:將最優的一條執行
    6.1 與存儲引擎層建立交互的線程
    6.2 將要執行的sql發給存儲引擎層
7.如果有緩存,則走緩存
8.記錄日志(如binlog)

存儲引擎層

1.接收SQL層傳來的語句
2.與磁盤交互,獲取數據,返回給sql層
3.建立與sql層交互的線程

mysql數據庫服務端-----》innodb存儲引擎
操作系統------------》文件系統
計算機硬件----------》硬盤

二、存儲引擎

定義

存儲引擎------說白了就是如何存儲數據、如何為存儲的數據建立索引和如何更新、查詢數據等技術的實現方法,專門處理其對應的類型的表。

存儲引擎決定了表的類型

            存儲引擎---------表
            視頻播放---------mp4
            文本編輯器-------txt 

#InnoDB 存儲引擎  ----默認在內存中已經建立了自適應的hash索引
#MyISAM 存儲引擎
只是讀取和插入,不支持事務、表級鎖設計、支持全文索引,不支持故障自動恢復,主要面向一些 OLAP 數 據庫應用,在 MySQL 5.5.8 版本之前是默認的存儲引擎(除 Windows 版本外)。它的緩沖池只緩存(cache)索引文件,而不緩存數據文件,這與 大多數的數據庫都不相同。   (.frm表結構      .MYD表數據     .MYI表索引)
#Memory 存儲引擎
正如其名,Memory 存儲引擎中的數據都存放在內存中,數據庫重 啟或發生崩潰,表中的數據都將消失。它非常適合于存儲 OLTP 數據庫應用中臨時數據的臨時表,也可以作為 OLAP 數據庫應用中數據倉庫的維度表。Memory 存儲引擎默認使用哈希 索引,而不是通常熟悉的 B+ 樹索引
#Infobright 存儲引擎
第三方的存儲引擎。其特點是存儲是按照列而非行的,因此非常 適合 OLAP 的數據庫應用。
#BLACKHOLE
黑洞存儲引擎,可以應用于主備復制中的分發主庫

innodb存儲引擎概述默認

----------------三大特性

事務              
行級鎖:innodb支持行級鎖,myisam是表級鎖,鎖的粒度越小并發能力越強(一次只運行一個,保障安全性)
支持外鍵

MVCC        多版本并發控制
備份和恢復   innodb支持支持熱備,myisam不支持
自動故障恢復 (CSR) Crash Safe Recovery

[root@egon db1]# cd /var/lib/mysql/db1/
[root@egon db1]# ls
db.opt  innodb_t1.frm  innodb_t1.ibd  innodb_t2.frm  innodb_t2.ibd

###      .frm表的元數據文件(表結構)     .ibd表的數據文件+索引文件

查看

MariaDB [(none)]> show engines\G  #查看所有支持的存儲引擎
MariaDB [(none)]> show variables like 'storage_engine%'; #查看正在使用的存儲引擎#查看使用innodb的表有哪些
# table_schema字段的值即表所在的庫
select table_schema,table_name,engine from information_schema.tables where engine='innodb';

#mysql5.6以后默認使用innodb存儲引擎

使用

1、建表時,使用不同的存儲引擎

    create table t1(id int)engine=blackhole;
    create table t2(id int)engine=memory;
    create table t3(id int)engine=myisam;
    create table t4(id int)engine=innodb;

2、修改配置文件指定默認的存儲引擎

/etc/my.cnf
[mysqld]
default-storage-engine=INNODB   #指定
innodb_file_per_table=1    # 讓每個表都有自己獨立的的ibd文件,如果不指定的話,所有表                                              的數據文件都會集中在/var/lib/mysql/ibdata1這個共享數據文件中

案例:升級存儲引擎

  • 準備工作----一臺新機器
源碼包安裝,二進制安裝# 配置yum源
[mysql56-community]
name=MySQL 5.6 Community Server
baseurl=http://repo.mysql.com/yum/mysql-5.6-community/el/7/$basearch/
enabled=1
gpgcheck=0# 獲取mysql5.7初始密碼
grep "temporary password" /var/log/mysqld.log# 設置密碼,密碼已經不能再用弱密碼了,弱密碼會報錯
set password=password("Egon@123");
  • 在舊機器上備份生產庫數據
# –triggers (默認導出觸發器,使用–skip-triggers屏蔽導出)
# -R:–routines,導出存儲過程以及自定義函數mysqldump -uroot -p123 -B db1 --triggers -R  > /tmp/db1.sql
  • 處理備份數據(更改默認存儲引擎)
[root@db01 ~]# sed -i 's#ENGINE=MYISAM#ENGINE=INNODB#gi' /tmp/db1.sql
  • 將備份的數據傳到新的數據庫服務器上并將修改后的備份恢復到新庫
scp  rsync 硬件設備  NFS
mysql -uroot -p123 < /tmp/db1.sql
  • 應用測試環境連接新庫,測試所有功能
  • 停止應用,將備份之后的生產庫發生的新變化補償到新庫
  • 應用切割到新數據庫

Innodb邏輯架構

mysql數據庫服務端---》innodb存儲引擎--》用戶態內存空間(應用程序的內存空間)
操作系統------------》文件系統--------》os cache(操作系統緩存)
計算機硬件----------》硬盤------------》硬盤結構(硬盤中的數據)

             

內存架構

innodb內存
  1. 緩沖池(優化讀)
  2. 寫緩沖(優化寫)
  3. 日志緩沖
  4. 自適應哈希索引

操作系統緩存

為了提升性能而降低磁盤IO的次數(攢一波再寫入),在InnoDB的緩存體系與磁盤文件之間,加了一層操作系統的緩存/頁面緩存。用戶態innodb存儲引擎的進程向操作系統發起write系統調用時,在內核態完成頁面緩存寫入后即返回,如果想立即將頁面緩存的內容立即刷入磁盤,innodb存儲引擎需要發起fsync系統調用才可以。

兩個系統調用(按一定頻率配合使用):

  • write:將數據寫入操作系統的頁面緩存后立即返回(存在丟失數據的風險)
  • fsync:將數據立即提交到硬盤中,強制硬盤同步(大量進行會出現性能瓶頸)

O_DIRECT

選項是在Linux系統中的選項,使用該選項后,對文件進行直接IO操作,不經過文件系統緩存,直接寫入磁盤

硬盤上的架構
  1. 表  文件----一堆二進制亂碼
  2. 表空間   ibd文件
  3. 索引
  4. 雙寫緩沖:位于表空間,記錄innodb緩存改動之前的數據
  5. redo日志:記錄尚未完成的操作,斷電則用其重做(崩潰恢復)
  6. undo日志:記錄改動之前的舊數據,一旦改錯可以回滾


###      默認情況下,創建InnoDB表的時候innodb_file_per_table參數是開啟的,它表明用戶創建的表和索引,會被以單表單文件的形式放入到file-per-table表空間中。如果禁用了該參數innodb_file_per_table,那么表及索引會被放入系統表空間(共享表空間)中
 


Innodb存儲引擎執行流程

執行一條更新sql語句------三大階段,8小步驟

  1. 執行階段
    數據加載到內存,寫undo log,更新內存中的數據,寫redo log buffer
  2. 事務提交階段
    redo log 和 binlog 刷盤,commit標記寫入redo log 中
  3. 最后
    后臺io線程隨機把被內存中的臟數據刷到磁盤上

  • 把該行數據從磁盤加載到buffer pool 中,并對該行數據進行加鎖
  • 把舊數據寫入undo log以便修改出錯的情況下進行回滾
  • 在buffer pool 中的數據更新,得到臟數據
  • 將修改后的臟數據寫入redo log buffer中
  • 準備提交事務,redo log 刷入磁盤
  • 把修改的操作記錄準備寫入binlog日志(事務提交時)
  • 把binlog的文件名和位置寫入commit標記,commit標記寫入redo log 中(redo log 中存放的修改后的數據與binlog中的修改操作對應上,雙管齊下),事務的提交才算成功,否則不會成功
  • IO線程buffer pool 中的臟數據刷入磁盤文件,完成最終修改

補充:

  1. redo接受臟數據(改動后的數據)-----先放到緩沖區再放到磁盤
    binlog接受詳細改動操作的信息-----直接寫入磁盤
  2. 第八步IO操作最耗時間
  3. innodb_flush_log_at_trx_commit參數(redo log刷盤策略)
    1  默認值,事務提交時必須把redo log從內存刷入磁盤(安全性最高,最耗時)
    0  等待innodb主動執行刷新磁盤(風險最高)    
    2  直接把日志放到操作系統緩存,等待操作系統刷新磁盤(mysql掛了機器沒掛數據不會丟失) 
  4. sync_binlog參數(binlog刷盤策略)
    0

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

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

相關文章

系統思考:短期困境與長期收益

最近在項目中&#xff0c;一直有學員會提到一個議題&#xff0c;如何平衡當前困境和長期收益&#xff1f; 我的思考是在商業和人生的路上&#xff0c;我們常常聽到“魚和熊掌不可兼得”的說法&#xff0c;似乎短期利益和長期目標注定是對立的。但事實上&#xff0c;魚與熊掌是…

Spring Web MVC快速入門

什么是Spring Web MVC Spring Web MVC 是基于 Servlet API 構建的原始 Web 框架&#xff0c;從?開始就包含在 Spring 框架中。它的正式名稱“Spring Web MVC”來?其源模塊的名稱(Spring-webmvc)&#xff0c;但它通常被稱為"Spring MVC". View(視圖) 指在應?程序…

DeepSeek基于注意力模型的可控圖像生成

DeepSeek大模型高性能核心技術與多模態融合開發 - 商品搜索 - 京東 圖像的加噪與模型訓練 在擴散模型的訓練過程中&#xff0c;首先需要對輸入的信號進行加噪處理&#xff0c;經典的加噪過程是在圖像進行向量化處理后在其中添加正態分布&#xff0c;而正態分布的值也是與時間…

第十六屆藍橋杯B組第二題

當時在考場的時候這一道題目 無論我是使用JAVA的大數&#xff08;BIGTHGER&#xff09;還是賽后 使用PY 都是沒有運行出來 今天也是突發奇想在B站上面搜一搜 看了才知道這也是需要一定的數學思維 通過轉換 設X來把運算式精簡化 避免運行超時 下面則是代碼 public class lanba…

HT71663同步升壓2.7V-13V輸入10A聚能芯半導體禾潤一級代理

在便攜式設備飛速發展的今天&#xff0c;電源轉換效率與產品尺寸始終是行業難以平衡的難題。但現在&#xff0c;HT71663 高功率全集成升壓轉換器強勢登場&#xff0c;一舉打破僵局&#xff0c;為便攜式系統帶來顛覆性的高效小尺寸解決方案&#xff01;? HT71663 的卓越性能&am…

Unity:輸入系統(Input System)與持續檢測鍵盤按鍵(Input.GetKey)

目錄 Unity 的兩套輸入系統&#xff1a; &#x1f50d; Input.GetKey 詳解 &#x1f3af; 對比&#xff1a;常用的輸入檢測方法 技術底層原理&#xff08;簡化版&#xff09; 示例&#xff1a;角色移動 為什么會被“新輸入系統”替代&#xff1f; Unity 的兩套輸入系統&…

港大今年開源了哪些SLAM算法?

過去的5個月&#xff0c;香港大學 MaRS 實驗室陸續開源了四套面向無人機的在線 SLAM 框架&#xff1a;**FAST-LIVO2 、Point-LIO&#xff08;grid-map 分支&#xff09; 、Voxel-SLAM 、Swarm-LIO2 **。這四套框架覆蓋了單機三傳感器融合、高帶寬高速機動、長時間多級地圖優化以…

【質量管理】TRIZ因果鏈分析:解碼質量問題的“多米諾效應“

為什么要使用因果鏈分析 沒有發現問題并不等于沒有問題。愛因斯坦曾說&#xff0c;如果我只有一個小時的時間來拯救世界&#xff0c;我將花45分鐘時間分析問題&#xff0c;10分鐘的時間來檢查問題&#xff0c;最后5分鐘的時間來解決問題。可見問題分析的重要性。 在質量管理實踐…

線程中常用的方法

知識點詳細說明 Java線程的核心方法集中在Thread類和Object類中,以下是新增整合后的常用方法分類解析: 1. 線程生命周期控制 方法作用注意事項start()啟動新線程,JVM調用run()方法多次調用會拋出IllegalThreadStateException(線程狀態不可逆)。run()線程的任務邏輯直接調…

c++:迭代器(Iterator)

目錄 &#x1f6aa;什么是迭代器&#xff1f; &#x1f527; 迭代器的本質 為什么不用普通數組或下標&#xff1f; STL容器的迭代器并不是共用一個類型&#xff01; 迭代器的類型&#xff08;Iterator Categories&#xff09; &#x1f4e6; 常見容器的迭代器類型 ? 迭…

【文件系統—散列結構文件】

文章目錄 一、實驗目的實驗內容設計思路 三、實驗代碼實現四、總結 一、實驗目的 理解linux文件系統的內部技術&#xff0c;掌握linux與文件有關的系統調用命令&#xff0c;并在此基礎上建立面向隨機檢索的散列結構文件&#xff1b;## 二、實驗內容與設計思想 實驗內容 1.設…

力扣26——刪除有序數組中的重復項

目錄 1.題目描述&#xff1a; 2.算法分析&#xff1a; 3.代碼展示&#xff1a; 1.題目描述&#xff1a; 給你一個 非嚴格遞增排列 的數組 nums &#xff0c;請你 原地 刪除重復出現的元素&#xff0c;使每個元素 只出現一次 &#xff0c;返回刪除后數組的新長度。元素的 相對…

ggplot2 | GO barplot with gene list

1. 效果圖 2. 代碼 數據是GO的輸出結果&#xff0c;本文使用的是 metascape 輸出的excel挑選的若干行。 # 1. 讀取數據 datread.csv("E:\\research\\scPolyA-seq2\\GO-APA-Timepoint\\test.csv", sep"\t") head(dat)# 2. 選擇所需要的列 dat.usedat[, c(…

學習搭子,秘塔AI搜索

什么是秘塔AI搜索 《秘塔AI搜索》的網址&#xff1a;https://metaso.cn/ 功能&#xff1a;AI搜索和知識學習&#xff0c;其中學習部分是亮點&#xff0c;也是主要推薦理由。對應的入口&#xff1a;https://metaso.cn/study 推薦理由 界面細節做工精良《今天學點啥》板塊的知…

【C語言】--指針超詳解(三)

目錄 一.數組名的理解 二.使用指針訪問數組 三.一維數組傳參的本質 四.冒泡排序 五.二級指針 六.指針數組 6.1--指針數組的定義 6.2--指針數組模擬二維數組 &#x1f525;個人主頁&#xff1a;草莓熊Lotso的個人主頁 &#x1f3ac;作者簡介&#xff1a;C方向學習者 &…

Linux防火墻

1.防火墻是一種位于內部網絡與外部網絡之間的網絡安全系統&#xff0c;它依照特定的規則&#xff0c;允許或限制傳輸的數據通過&#xff0c;以保護內部網絡的安全。以下從功能、分類、工作原理等方面為你詳細講解&#xff1a; 功能訪問控制&#xff1a;這是防火墻最主要的功能。…

嵌入式培訓之C語言學習完(十七)結構體、共用體、枚舉、typedef關鍵字與位運算

目錄 一、結構體&#xff08;struct關鍵字&#xff09; &#xff08;一&#xff09;聲明一個結構體數據類型 &#xff08;二&#xff09;結構體的成員初始化與賦值 a、結構體變量賦值 b、結構體成員初始化 c、結構體的定義形式 &#xff08;三&#xff09;考點&#xff…

Python字典:數據操作的核心容器

在Python編程生態中&#xff0c;字典&#xff08;dict&#xff09;是最常用且功能強大的內置數據結構之一。它以鍵值對&#xff08;Key-Value Pair&#xff09;的形式存儲數據&#xff0c;為快速查找、靈活映射關系提供了天然支持。無論是數據清洗、算法實現還是Web開發&#x…

按位寬提取十六進制值

需求&#xff1a;給出一個十六進制值&#xff0c;要求提取high和low位之間的值。比如16ha0f0&#xff0c;這是一個16bit寬的十六進制數0xa0f0&#xff0c;提取[15:12]范圍內的值。 def extract_bits(value, high, low):"""從 value 中提取 [high:low] 位的值:p…

LeRobot 項目部署運行邏輯(六)——visualize_dataset_html.py/visualize_dataset.py

可視化腳本包括了兩個方法&#xff1a;遠程下載 huggingface 上的數據集和使用本地數據集 腳本主要使用兩個&#xff1a; 目前來說&#xff0c;ACT 采集訓練用的是統一時間長度的數據集&#xff0c;此外&#xff0c;這兩個腳本最大的問題在于不能裁剪&#xff0c;這也是比較好…