My SQL 學習打卡 60天搞定mysql

2022-05-27 04:39:09 字數 2691 閱讀 4430

mysql 5.5.5 版本開始innodb成為了預設儲存引擎

聯結器:

鏈結器超時斷開引數 wait_timeout   預設 8小時

快取mysql 快取提供按需使用的方式  將引數 query_cache_type 設定成 demand,這樣對於預設的 sql 語句都不使用查詢快取。而對於你確定要使用查詢快取的語句,可以用 sql_cache 顯式指定

mysql 8.0 版本直接將查詢快取的整塊功能刪掉了

mysql> select sql_cache * from t where id=10;
分析器:

分析器先會做「詞法分析」。再做「語法分析」 

優化器:

優化器是在表裡面有多個索引的時候,決定使用哪個索引;或者在乙個語句有多表關聯(join)的時候,決定各個表的連線順序。

執行器:

首先判讀使用者對錶有沒有查詢許可權。如果有許可權,就開啟表繼續執行。開啟表的時候,執行器就會根據表的引擎定義,去使用這個引擎提供的介面。

資料庫的慢查詢日誌中看到乙個 rows_examined 的字段,表示這個語句執行過程中掃瞄了多少行。這個值就是在執行器每次呼叫引擎獲取資料行的時候累加的

更新比查詢多涉及兩個日誌模組  redo log 和 binlog

mysql> update t set c=c+1 where id=2;
redo log 屬於innodb 獨有日誌。

如圖 innodb 的 redo log 是固定大小的,比如可以配置為一組 4 個檔案,每個檔案的大小是 1gb,那麼這塊「粉板」總共就可以記錄 4gb 的操作。從頭開始寫,寫到末尾就又回到開頭迴圈寫。  

write pos 是當前記錄的位置 heckpoint 是當前要擦除的位置。中間綠色部分為剩餘空間。

有了 redo log,innodb 就可以保證即使資料庫發生異常重啟,之前提交的記錄都不會丟失,這個能力稱為 crash-safe

binlog 是server 層的日誌

這兩種日誌有以下三點不同。

redo log 是 innodb 引擎特有的;binlog 是 mysql 的 server 層實現的,所有引擎都可以使用。

redo log 是物理日誌,記錄的是「在某個資料頁上做了什麼修改」;binlog 是邏輯日誌,記錄的是這個語句的原始邏輯,比如「給 id=2 這一行的 c 欄位加 1 」。

redo log 是迴圈寫的,空間固定會用完;binlog 是可以追加寫入的。「追加寫」是指 binlog 檔案寫到一定大小後會切換到下乙個,並不會覆蓋以前的日誌。

這個 update 語句的執行流程圖,圖中淺色框表示是在 innodb 內部執行的,深色框表示是在執行器中執行的。

最後三步將 redo log 的寫入拆成了兩個步驟:prepare 和 commit,這就是"兩階段提交"

好處:為了讓兩份日誌之間的邏輯一致

隔離級別

當資料庫上有多個事務同時執行的時候,就可能出現髒讀(dirty read)、不可重複讀(non-repeatable read)、幻讀(phantom read)的問題,為了解決這些問題,就有了「隔離級別」的概念。

sql 標準的事務隔離級別包括:讀未提交(read uncommitted)、讀提交(read committed)、可重複讀(repeatable read)和序列化(serializable )

mysql> show variables like 'transaction_isolation';
事務隔離的實現

在 mysql 中,實際上每條記錄在更新的時候都會同時記錄一條回滾操作。記錄上的最新值,通過回滾操作,都可以得到前乙個狀態的值。

假設乙個值從 1 被按順序改成了 2、3、4,在回滾日誌裡面就會有類似下面的記錄。

當前值是 4,但是在查詢這條記錄的時候,不同時刻啟動的事務會有不同的 read-view。

如圖中看到的,在檢視 a、b、c 裡面,這乙個記錄的值分別是 1、2、4,同一條記錄在系統中可以存在多個版本,就是資料庫的多版本併發控制(mvcc)

事務的啟動方式

mysql 有以下兩種啟動事務的方式

顯式啟動事務語句, begin 或 start transaction。配套的提交語句是 commit,回滾語句是 rollback。

set autocommit=0,這個命令會將這個執行緒的自動提交關掉。意味著如果你只執行乙個 select 語句,這個事務就啟動了,而且並不會自動提交。這個事務持續存在直到你主動執行 commit 或 rollback 語句,或者斷開連線。

執行 commit 則提交事務。如果執行 commit work and chain,則是提交事務並自動啟動下乙個事務

你可以在 information_schema 庫的 innodb_trx 這個表中查詢長事務,比如下面這個語句,用於查詢持續時間超過 60s 的事務。

打卡 Acwing學習記錄6 0

ps.學習打卡記錄 其實是在洛谷寫的題,acwing的還沒做 1 花生採摘 題意簡述 給一張花生的分布圖,從底部任意位置出發,每次都去花生最多的地方,問體力耗盡前能採多少。因為固定了每次都去最多的地方,所以不存在 dpdp dp的問題,直接照著題意模擬即可。include using namespa...

LeetCode高頻面試60天打卡日記Day15

遞迴遍歷尋找最大連續1的個數 島嶼面積 public intdfs int i,int j,int grid grid i j 0 把當前 i j 置為0 防止回溯遍歷出現棧溢位 int num 1 num dfs i 1,j,grid num dfs i 1,j,grid num dfs i,j ...

LeetCode高頻面試60天打卡日記Day31

氣泡排序 public void bubblesort int nums if issort 選擇排序 public void selectsort int nums 交換資料把最小的元素給i int temp nums minindex nums minindex nums i nums i te...