主頁 > 資料庫 > MySQL實戰45講之基礎篇

MySQL實戰45講之基礎篇

2021-09-07 07:24:47 資料庫

前言

本文主要記錄學習MySQL實戰45講之基礎篇程序中一些新的識訓,以及總結主要內容,其中包括SQL如何運行、日志系統、事務隔離、索引和鎖等,

基礎架構

MySQL邏輯架構圖

連接器,建立連接的程序中,連接器會查詢用戶的權限,本次之后的操作都依賴此時查詢出來的權限,意味著,即使你用管理員賬號修改了用戶的權限,也不會影響已經存在的連接,

查詢快取,大部分場景下查詢快取都是弊大于利,因為一旦表發生修改,快取就會失效,除非是靜態表,即永遠不發生修改的,并且,MySQL8.0已經將該功能移除,

分析器,對SQL進行詞法分析、語法分析,

優化器,通過分析器知道了要干什么,優化器則是選擇干的方案,比如說選擇哪個索引來執行?全表掃描還是索引掃描再回表?等等,

執行器,開始執行SQL,在執行之前,會先驗證用戶是否有查詢該表的權限,
為什么不在之前驗證表查詢權限呢?因為此處不僅要驗證表權限,可能還有觸發器權限,這個必須在運行時才能確認,

日志系統

redo log

1、用于崩潰恢復,由InnoDB引擎提供,
2、物理日志,記錄“在某個資料頁上做了什么修改”,通過redo log實作執行SQL之后,不需要馬上刷到磁盤,而是先寫日志,即WAL(Write Ahead Logging)技術,
3、日志固定大小,通過兩個指標回圈寫,比如 0 ~ write_pos ~ check_point ~ endwrite_pos ~ check_point之間的為可寫空間,check_point之后回圈到write_pos為待重繪到磁盤的資料,當write_pos追到check_point時會停止寫,先將check_point后的資料刷到磁盤,

bin log

1、用于操作歸檔及主從同步,由Server層提供,任何引擎都可以使用,
2、邏輯日志,SQL模式,記錄執行的SQL陳述句;row模式,記錄更新前和更新后的行記錄,
3、單個日志檔案有最大值,滿了后創建新的追加寫,

總結

redo logbin log使用兩階段提交來保證兩個日志的一致性,此外,通過全量備份和bin log可以恢復到之前任意時刻的資料庫狀態,

那每周一備和每日一備如何選擇?
每周一備,資料恢復時間大概率更長,但需要的存盤空間更少;而每日一備,資料的恢復時間更短,但需要的存盤空間更多,如何選擇,則看業務的重要性考慮,

隔離原理

在可重復讀隔離級別下,對于同一個值,不同時刻啟動的事務可能讀取到不同的值,也叫快照讀,這個同一條記錄多個版本就是多版本并發控制MVCC,不同版本的記錄即回滾日志,是在undo log中存盤的,

當然,這個回滾日志不能一直存在,如果沒有比這潭訓滾日志更早的視圖時,日志就會被洗掉,insert操作在事務提交后會直接洗掉,updatedelete操作會寫到undo log list中,當判定不會被使用后,要么重用,要么放到洗掉串列等待purge執行緒清除,

由上可知,長事務存在一個弊端就是會有很多老視圖存在資料庫中占據存盤空間,所以,建議開啟事務的自動提交set autocommit=1,如果想避免每次開啟事務的互動,可以考慮用commit work and chain優化,提交事務并啟動下一個事務,

索引結構

哈希表,只適用于等值查詢的場景,比如Nosql資料庫等,對于范圍查詢必須全表掃描,

有序陣列,只從查詢效率上考慮的話是很好的結構,但是插入洗掉時需要移動元素,所以,只適用于靜態存盤的場景,即從不發生改變的表,

樹,增刪改查效率都比較好,由于對于同樣大小的資料,二叉樹高度遠高于N叉樹,所以為了減少查詢時的IO讀取,選擇的是N叉樹,且N差不多為1200,這樣的樹第4層的節點就有上億個,即大部分存盤場景只需要3~4層就可以滿足,并且,一般會提前將1 or 2層先加載到記憶體,

主鍵索引選擇

主鍵索引一般默認選擇自增主鍵,原因如下:
1、性能上,自增主鍵插入索引樹,默認是追加,可以有效地避免頁分裂,頁分裂需要創建新的頁,并拷貝資料,必然影響性能,
2、存盤空間上,自增主鍵一般只占用4 or 8位元組,采用其他像字串一樣的作為索引需要更多的存盤空間,并且,主鍵值型別占用空間越多,普通索引的占用空間也越大,

重建索引

為什么需要重建索引?
因為洗掉資料或頁分裂,可能導致索引出現空洞,雖然后續操作會盡可能地填補空洞,但始侄訓存在存盤空間的浪費,而重建索引后,可以讓資料緊湊,消除資料空洞,提高空間利用率,

不過注意,如果要重建主鍵索引,默認會洗掉所有的索引樹再重新創建,此時,可以考慮用Alter Table t Engine = InnoDB

全域鎖

全域鎖,就是對資料庫物件上鎖,MySQL支持全域讀鎖,Flush Table With Read Lock(FTWRL),上鎖后會阻塞增刪改操作,DDL操作(創建表、修改表結構等)和更新類事務操作,

全域鎖的一個典型場景是全量備份,備份期間,業務停止作業且主從庫之間資料同步停止,這是比較低效的,不過,這是不支持事務的存盤引擎使用的備份方式,對于支持事務的引擎,可以通過在可重復讀隔離級別下,開啟單個事務來備份,即不用上鎖就可以實作一致性讀,

表級鎖

表級鎖,分為兩種表鎖和元資料鎖(meta data lock,MDL),表鎖就是對表資料顯式上鎖和釋放,避免同時對表資料修改;而元資料鎖,則是隱式對表結構上鎖和釋放,分為讀鎖和寫鎖,讀取資料時上讀鎖,修改表結構上寫鎖,讀寫和寫寫互斥,避免讀取資料時其他事務修改表結構,

注意,如果在一個事務中,先出現DML讀取資料,再進行DDL修改表結構,則會阻塞后續的所有讀寫操作,

那如何安全地給小表加欄位?
1、如果有長事務存在,考慮先暫停DDL或者kill掉這個長事務,
2、如果修改的表是熱點表,并且不得不加欄位,此時kill基本沒用,考慮給DDL設定等待時間,失敗了等一段時間再重試吧,

行鎖

在一個事務中對某一行加鎖并處理完后,并不會馬上釋放鎖,而是遵循兩階{段鎖協議,所以,為了盡量減少鎖沖突,盡量讓可能發生鎖沖突的操作在事務最末尾執行,

  1. 一階段鎖協議
    直接嘗試一次性獲取所有鎖資源,如果其中一個獲取失敗,就不執行事務,并在事務尾端釋放所有資源,
    一階段鎖協議解決了死鎖問題,但事務并發度不高,

  2. 兩階段鎖協議
    整個事務分為兩個階段,第一階段進行上鎖,可以處理資料,但不能釋放鎖;第二階段開始釋放鎖,也可以處理資料,但不能再加鎖,
    兩階段鎖協議的并發度較高,因為釋放鎖不必在事務末尾,但它沒有解決死鎖問題,因為加鎖階段沒有順序要求,

死鎖

因為MySQL采用兩段鎖協議進行加鎖,如果加鎖順序不合理時,會產生死鎖,解決辦法有兩種,鎖超時死鎖檢測

鎖超時

如果因為發生死鎖一直鎖等待,到達超時時間后會自動回滾超時事務,MySQL默認設定了鎖等待超時時間,innodb_lock_wait_timeout=50s,并且通過下面陳述句操作:

查看:SHOW GLOBAL VARIABLES LIKE "innodb_lock_wait_timeout";
設定:SET GLOBAL innodb_lock_wait_timeout=1500;

死鎖檢測

MySQL Server層提供的自動檢測機制,當發現兩個或多個事務形成死鎖時,會回滾其中一個或多個較小代價的事務,并且,MySQL默認開啟了死鎖檢測(innodb_deadlock_detect=on),

當事務并發量大時,死鎖檢測十分損耗CPU

那如何處理熱點行更新導致的性能問題?

首先,為什么會有性能問題呢?因為熱點行可能存在同一時刻大量事務更新同一個行,此時會出現大量鎖等待,并觸發死鎖檢測,每個死鎖檢測都是O(n)的時間復雜度,導致損耗大量的CPU資源,

第一個頭痛醫頭的方法是,如果可以確認不會發生死鎖,可以考慮關閉死鎖檢測,但這一般不采用,

第二個方法是減少并發度,避免同一時刻觸發太多的死鎖檢測,比如控制同一時刻每行最多只有10個執行緒在更新,或者將原先的一行拆分成多行,這樣就可以將原先的并發量縮減為原來的1/n,但視業務場景,可能要考慮拆分成多行造成的副作用,做一個詳細方案的設計,

快照讀和當前讀

快照讀

快照讀是可重復讀隔離級別下默認的查詢方式,在每個事務啟動時,都會先創建一份讀視圖,根據視圖讀取資料,

這個視圖實際上就是一個事務id陣列,表示當前事務啟動時,全庫范圍內“活躍”的未提交事務id,每個事務都有一個唯一的事務id,由InnoDB事務系統在事務創建前分配,并且按申請順序嚴格遞增,

此外,真實的快照資料存盤在undo log中,在事務更新行記錄前,都會在undo log中存盤歷史版本資料,并記錄上當前事務的id,表示row trx_id,從而,通過當前執行的事務id和行的歷史版本中的row trx_id比較,就可以判斷哪些資料可見,

undo log是邏輯日志,存盤的是與更新時相反的邏輯,就是下圖中的U1、U2、U3,而V1、V2、V3、V4是不存在的,需要臨時計算出來,

行狀態變更圖

可見性結論:
1、版本未提交,不可見,
2、版本已提交,但是在視圖創建后提交的,不可見,
3、版本已提交,在視圖創建前提交,可見,

當前讀

當前讀用于更新陳述句,或者加鎖的查詢操作(SELECT * FROM t lock in share mode或者SELECT * FROM for update,分別加了共享鎖和排他鎖),讀取資料時會獲取最新版本,

總結而言,可重復讀依賴快照讀實作,當要更新資料時,則采用當前讀,

另外,提交讀隔離級別下也用到了視圖,不過與可重復讀創建視圖的時機不同,可重復讀下,只在事務啟動時創建視圖,提交讀則是每次執行陳述句前都創建一次視圖,

參考

  • [1] MySQL 45講
  • [2] MySQL undo log日志

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

標籤:其他

上一篇:MySQL全域鎖、表鎖、行鎖決議

下一篇:你的 SQL 還在回表查詢嗎?快給它安排覆寫索引

標籤雲
其他(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