• <track id="6xmvl"></track>
    <pre id="6xmvl"></pre>
      <output id="6xmvl"><strong id="6xmvl"><div id="6xmvl"></div></strong></output>
    1. 微信登錄
      注冊忘記密碼
      查看: 3117|回復: 17
      打印 上一主題 下一主題

      深入簡出mysql總結

      [復制鏈接]

      該用戶從未簽到

      跳轉到指定樓層
      樓主
      發表于 2022-11-8 07:45:41 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
      1.一條查詢語句怎么執行的

      2.一條update語句怎么執行的




      redo log,binlog
      WAL(write-ahead logging,先寫日志再寫磁盤),更新的時候就是寫到redo log,等合適的時機再寫入磁盤。
      redo log是固定大小的,寫完就從開頭寫。
      crash-safe:異常重啟的時候,有了redo log數據不會丟失。
      redo log在引擎層,物理日志(記錄的是“在某個數據頁上做了什么修改”),空間有限;binlog是在server層,邏輯日志(記錄語句的原始邏輯),可以追加日志。

      redolog-prepare,寫binlog,commit,redolog
      當需要恢復到指定的某一秒時,比如某天下午兩點發現中午十二點有一次誤刪表,需要找回數據,那你可以這么做:首先,找到最近的一次全量備份,如果你運氣好,可能就是昨天晚上的一個備份,從這個備份恢復到臨時庫;然后,從備份的時間點開始,將備份的 binlog 依次取出來,重放到中午誤刪表之前的那個時刻。
      innodb_flush_log_at_trx_commit 這個參數設置成 1 的時候,表示每次事務的 redo log 都直接持久化到磁盤。這個參數我建議你設置成 1,這樣可以保證 MySQL 異常重啟之后數據不丟失。
      sync_binlog 這個參數設置成 1 的時候,表示每次事務的 binlog 都持久化到磁盤。這個參數我也建議你設置成 1,這樣可以保證 MySQL 異常重啟之后 binlog 不丟失。

      3.索引
      b+樹
      覆蓋索引
      聯合索引
      索引下推優化(mysql5.6+):在索引查找過程中,直接過濾掉索引中相關的字段,減少回表次數。

      4.鎖
      全局鎖,表鎖
      行鎖,將復雜業務的鎖放到事務執行的最后,減少這個操作的鎖時間。
      死鎖解決方式:1)超時(innodb_lock_wait_timeout);2)死鎖檢測(innodb_deadlock_detect 設置為 on),主動回滾某個事務。
      超時時間不好把控,所以一般采用死鎖檢測的方式。

      5.mvcc
      多版本并發控制
      每個數據都有多個版本
      每個事務在啟動的時候有其他正在run的事務數組,某個事務id不在這個數組里就是代表是提交了的,可以訪問。
      更新數據的時候是先讀后寫的,只能基于當前讀來寫。
      每個事務或語句都有自己的一致性視圖。
      已提交讀每次讀取都會生成一個新的readview,而可重復讀只會第一次生成readview。

      6.delete數據
      刪除數據只是被標記為可復用,并不能釋放空間,所以表空間沒有變小。插入數據時,前一個數據頁也會留下空洞。
      處理空洞,垃圾碎片。
      alter table A engine=InnoDB 命令來重建表
      optimize table t 等于 recreate+analyze

      7.慢查詢
      set long_query_time=0,記錄慢查詢。

      8.間隙鎖,next-key lock
      間隙鎖和間隙鎖沒有沖突,只和“新插入記錄”有沖突。只在rr級別下才會引入間隙鎖,間隙鎖可能導致死鎖。
      兩個原則:1)加鎖的基本單位是next-key lock;2)只有查詢中訪問到的對象才會加鎖。
      兩個優化:1)唯一索引的等值查詢,next-key lock退化為行鎖;
      2)索引的等值查詢,向右遍歷到最后一個值還不匹配時,nexk-key lock退化到間隙鎖;
      一個bug:唯一索引上的范圍查詢會查詢到第一個不滿足條件的指為止。

      9.數據不丟失
      binlog:binlog-cache,binlog,每個線程先寫到自己的binlog-cache里,然后刷盤到磁盤,可以實時同步,也可以累積n個事務后批量刷盤。
      redolog:redolog prepare,binlog,redolog commit。一般都是寫入cache,然后批量刷盤。刷盤有后臺進程處理。
      binlog和redolog都是順序寫的,組提交機制節省io開支。

      10.主備一致

      binlog格式:statement(sql執行記錄,同步可能導致主從不一致),row(每行執行的記錄),mixed(判斷是否導致主從不一致,從而選擇合適statement或row格式)。
      seconds_behind_master:主備延遲時間

      11.主從延遲
      解決方案:強制走主庫,sleep


      聲明:以上內容來源于網絡,如有侵權請聯系我們(123@shiyan.com)刪除!

      該用戶從未簽到

      沙發
      發表于 2022-11-8 07:50:15 | 只看該作者
      轉發了
      回復 支持 反對

      使用道具 舉報

      該用戶從未簽到

      椅子
      發表于 2022-11-8 07:54:25 | 只看該作者
      轉發了
      回復 支持 反對

      使用道具 舉報

      該用戶從未簽到

      板凳
      發表于 2022-11-8 07:59:22 | 只看該作者
      轉發了
      回復 支持 反對

      使用道具 舉報

      簽到天數: 3 天

      [LV.2]偶爾看看I

      地板
      發表于 2022-11-8 08:03:38 | 只看該作者
      轉發了
      回復 支持 反對

      使用道具 舉報

      該用戶從未簽到

      6
      發表于 2022-11-8 08:09:32 | 只看該作者
      轉發了
      回復 支持 反對

      使用道具 舉報

      該用戶從未簽到

      7
      發表于 2022-11-8 08:14:47 | 只看該作者
      轉發了
      回復 支持 反對

      使用道具 舉報

      簽到天數: 176 天

      [LV.7]常住居民III

      8
      發表于 2022-11-8 08:19:51 | 只看該作者
      轉發了
      回復 支持 反對

      使用道具 舉報

      該用戶從未簽到

      9
      發表于 2022-11-8 08:21:52 | 只看該作者
      轉發了
      回復 支持 反對

      使用道具 舉報

      該用戶從未簽到

      10
      發表于 2022-11-8 08:24:00 | 只看該作者
      轉發了
      回復 支持 反對

      使用道具 舉報

      發表回復

      您需要登錄后才可以回帖 登錄 | 立即注冊 微信登錄

      本版積分規則