日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL概要——《深究MySQL》

發布時間:2025/3/20 数据库 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL概要——《深究MySQL》 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1. MySQL架構

  • MySQL的存儲引擎架構將查詢處理等系統任務和數據的存或取相分離。這種分離設計使得可根據不同的需求選擇不同的存儲方式。

  • 存儲引擎不會解析SQL,InnoDB例外,它會解析外鍵定義,因為MySQL服務器本身沒有實現該功能。

  • MySQL會解析查詢并創建內部數據結構(解析樹),然后對其進行重寫查詢、決定表的讀取順序、選擇合適的索引等優化。

  • 2. 鎖

  • 讀鎖(也叫共享鎖),互不干擾。只有沒有寫鎖時,其他用戶才能獲得讀鎖。

  • 寫鎖(也叫排他鎖),會阻塞其他的讀鎖和寫鎖。

  • 鎖的各種操作,包括獲得鎖、檢查鎖是否已經刪除、釋放鎖等都會增加系統開銷。

  • 鎖策略:在鎖的開銷和數據安全性之間尋求平衡。

  • 每種MySQL存儲引擎都能自定義鎖策略和鎖粒度。

  • 表鎖:會銷定整張表,它是MySQL中最基本的鎖策略,也是開銷最小的鎖策略。

  • 行級鎖:支持最大程度的并發處理(開鎖也大),它只在存儲引擎層實現,而在MySQL服務層中沒有實現。

  • 死鎖:兩個或者多個事務都在請求鎖定對方占用的資源的現象。

  • 解決死鎖辦法:部分全部回滾其中一個事務

  • 死鎖示例:當兩個事務同時執行完第一句SQL,緊接著執行第二句SQL時就會發現資源被對方占用

    事務1:
    start transaction
    update user set age = 20 where userId=3;
    update user set age = 20 where userId=4;

    事務2:
    start transaction
    update user set age = 20 where userId=4;
    update user set age = 20 where userId=3;

  • 鎖只有在事務commit(提交)或rollback(回滾)的時候才會釋放,且所有的鎖都在同一時刻釋放。

  • 3. 事務

    3.1 事務的幾個特性

  • 原子性(atomicity): 一個事務是一個最小的邏輯執行單元

  • 一致性(consistency): 數據庫數據在邏輯上要保持一致。如一個用戶轉出了200,那另一個用戶必須增加200元。

  • 隔離性(isolation): 一個事務的修改在最終提交之前,其他事務是不可見的。即不能影其他事務。

  • 持久性(durablility): 事務最終提交之后,修改就要被永遠保存在數據庫中,而不會像回滾一樣能撤銷。

  • 3.2 隔離級別

  • read uncommitted(讀未提交):一個事務可以讀到另一個事務未提交的數據。會有“臟讀”、“不可重復讀”、“幻讀”的問題。

  • read committed(讀提交:大多數據庫默認級別): 一個事務只能讀到另一個事務提交后的修改。會有“不可重復讀”、“幻讀”的問題。

  • repeatable read(可重復讀:MySQL默認級別):在一個事務中多次讀取同一個記錄時,結果一樣。
    【這是因為該事務鎖住了這條數據記錄,其他事務不能作任何修改(但可讀),所以多次讀取同一記錄時結果一樣】
    會有“幻讀”的問題。幻讀指的是某個事務兩次讀取某范圍內的數據時,數據不一致。

  • serializable:事務會串行執行。此時會在讀取的每一行數據都加鎖,就會可能導致超時和爭鎖的問題。

  • 低的隔離級別可以執行更高的并發,系統開銷也相對較低。

    3.3 MySQL中的事務

  • MySQL中的兩種事務型存儲引擎:InnoDB、NDB Cluster

  • DDL(create alter drop等)、DCL(grant,deny,revoke等與用戶角色權限相關操作)會強制自動提交事務,DML(select、update、insert、delete等)需要手動提交事務

  • 3.4 事務日志

  • 作用:提高事務的效率

  • 原理: 存儲引擎在修改表的數據時,只會修改其內存拷貝,然后把該修改操作持久到硬盤上的事務日志中,而不用每次都將修改的數據本身持久到磁盤上。事務日志持久以后,內存中被修改的數據在后臺可以慢慢地刷回到磁盤。此方式稱之為,預寫式日志,修改數據需要寫兩次磁盤。

  • 快的原因:事務日志采用的是追加的方式,寫事務日志的操作是磁盤上的順序I/O,而不像隨機I/O要在磁盤上多個地方移動磁頭。

  • 另一個優點:如果數據的修改已經紀錄到事務日志中,但數據本身還沒有寫回磁盤,如果此時系統崩潰,存儲引擎在重啟時,能夠自動恢復這部分修改的數據

  • 開啟事務日志:待查?????

  • 4. 多版本并發控制(MVCC: multi-version concurrency control)

  • MVCC定義:多版并發控制系統。可認為是行級鎖的一個變種,它能夠避免更多情況下的加鎖操作。

  • 作用:避免一些加鎖操作,提升并發性能。

  • 實現:通過在每行記錄的后面保存行的創建時間過期時間或刪除時間(它們是隱藏的),這兩個時間實際都是系統的版本號。每開始一個新的事務,版本號都會自動增加

  • 具體原理
    4.1) select:innoBD查詢時會檢查以下兩個條件:一個是數據行的版本號早于當前事務的版本號;另一個是行的刪除版本號,要么沒有,要么大于當前事務的版本號。

    4.2)insert/delete:innoDB將當前的系統版本號作為新插入(刪除)的數據行的版本號。

    4.3)update:先新插入一行數據,并將當前系統版本號作為行的版本號,同時將當前系統版本號作為原來行的刪除版本號。

  • 注意:MVCC只在read committed和repeatable read兩個隔離級別下工作。

  • 總結

    以上是生活随笔為你收集整理的MySQL概要——《深究MySQL》的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。