1. 程式人生 > 其它 >mysql零碎知識點捕獲記錄

mysql零碎知識點捕獲記錄

1. show status 和 show innodb status 的區別

show status

可以檢視mysql的執行狀態,執行後發現查詢結果多達幾百行,我們可以從中獲取許多常用資訊,比如執行時間、連線、執行緒、鎖、慢查詢、buffer池等

 

 

具體使用可以檢視官方文件 MySQL :: MySQL 5.7 Reference Manual :: 5.1.9 Server Status Variables

show innodb status

這個命令我在我5.7版本的mysql上執行顯示命令錯誤,百度後發現這個是舊版本的命令,新版本的命令是 show engine innodb status

。可以檢視後臺執行緒、訊號量、死鎖等。

具體可以看這個專業人員寫的部落格 MYSQL show engine innodb status 這麼多年,你真的都懂? - 雲+社群 - 騰訊雲 (tencent.com)

2. 如何開啟慢日誌查詢

首先可以通過 show variables like '%quer%' 來檢視是否開啟,一般預設是不開啟的,slow_query_log的值是OFF。想要開啟的話,需要修改/etc/my.cnf這個配置檔案,在[mysqld]下面加上 slow_query_log = ON,然後重啟mysql。

也可以通過修改全域性變數來開啟,這樣不需要重啟,執行如下語句 set  @@global.slow_query_log = ON

另外,我們還可以將慢查詢日誌設定為儲存到表(表和檔案二選一),這個表是mysql.slow_log。操作命令為 set @@global.log_output='TABLE'

最後,介紹下分析慢查詢日誌的工具,有mysql自帶的 mysqldumpslow,還有第三方的Percona Toolkit、pt-query-digest

3. 如何檢視mysql死鎖

1) 檢視是否鎖表 show OPEN TABLES where In_use > 0      

2) 檢視執行的執行緒 show full processlist

補充:

檢視正在鎖的事務        SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS; 

檢視等待鎖的事務        SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS; 

4. 使用效能剖析工具 show profiles

這個工具預設關閉的,先執行命令開啟它,set profiling=1(這個命令不是全域性的,只在本會話範圍生效)。

1) 執行 SHOW PROFILES 可以看到開啟profiling之後所有查詢的執行時間;

2) 執行SHOW PROFILE [TYPE] FOR QUERY Query_ID 可以看到MySQL執行某個查詢各個步驟的各項效能指標的詳細資訊:

如果沒有指定FOR QUERY則顯示最近一條查詢的詳細資訊。TYPE是可選的,有以下幾個選項:

  • ALL 顯示所有效能資訊
  • BLOCK IO 顯示塊IO操作的次數
  • CONTEXT SWITCHES 顯示上下文切換次數,不管是主動還是被動
  • CPU 顯示使用者CPU時間、系統CPU時間
  • IPC 顯示傳送和接收的訊息數量
  • MEMORY [暫未實現]
  • PAGE FAULTS 顯示頁錯誤數量
  • SOURCE 顯示原始碼中的函式名稱與位置
  • SWAPS 顯示SWAP的次數

5. information_schema

一般稱之為元資料庫,我們建立的庫、表、列、索引、檢視、儲存過程等在這裡面都可以檢索到,所以也叫資料字典。另外我們之前提到過可以在INNODB_LOCKS這個表裡檢視正在被鎖的事務。最後,我們還可以在INNODB_BUFFER_PAGE、INNODB_BUFFER_PAGE_LRU、INNODB_BUFFER_POOL_STATS這三個表中檢視innodb快取池的情況。

innodb中的頁分三種,大家可以參考這篇博文 (23條訊息) Innodb Buffer Pool的三種Page和連結串列_老葉茶館-CSDN部落格

還有這篇博文,直接從原始碼起底page的生命週期,絕對是大牛所作 MySQL · 引擎特性 · InnoDB Buffer Page 生命週期 (vicsdf.com)

關於innodb快取池,本人目前也只是瞭解一點,這個比較底層,可能需要先熟悉作業系統虛存的段頁機制、mysql原始碼,才能徹底弄懂這玩意兒。

系統從磁碟讀取資料到記憶體時是以磁碟塊(block)為基本單位的,位於同一個磁碟塊中的資料會被一次性讀取出來,而不是需要什麼取什麼。 InnoDB儲存引擎中有頁(Page)的概念,頁是其磁碟管理的最小單位。InnoDB儲存引擎中預設每個頁的大小為16KB,可通過引數innodb_page_size將頁的大小設定為4K、8K、16K,在MySQL中可通過如下命令檢視頁的大小: mysql> show variables like 'innodb_page_size'; 而系統一個磁碟塊的儲存空間往往沒有這麼大,因此InnoDB每次申請磁碟空間時都會是若干地址連續磁碟塊來達到頁的大小16KB。

好吧,最後我不得不承認走題了。

6. 為啥innodb快取池中頁的大小預設是16kb?

在作業系統的檔案管理系統中進行一次io讀寫,預設讀取的大小為4kb(一頁)。又因為區域性性原理,作業系統會將命中的頁周圍的三塊頁一同載入進innodb的快取池中,因此innnodb快取池中頁的大小為16kb。

7. performance_schema

一個可以檢視mysql執行效能的工具,無侵入性,使用代價低,在mysql5.7.x以上的版本都是預設開啟的,需要注意以下幾點:

1)  儲存引擎都是performance_schema,儲存在記憶體中,如果資料庫重啟,資料會丟失

2)通過監視server事件來監視server內部執行情況,這裡的事件指函式呼叫、作業系統等待、sql執行等,寫入binlog事件不在範圍內。

可以參考這篇博文  (23條訊息) 初相識|performance_schema全方位介紹_老葉茶館-CSDN部落格