MYSQL IO 內部統計

2021-06-10 02:25:32 字數 2581 閱讀 3494

mysql提供的兩種儲存引擎myisam和innodb,下面分別根據兩種計量io的方法說明

「此處排除由於排序等操作產生的io」

訪問流程:

使用者發起請求,mysql解析並構造解析樹和優化樹,隨即呼叫hanlder介面,將請求分發給myisam,myisam根據執行計畫,在key buffer中探索key list ,如果keylist不在或不足,則將產生物理key read , 並獲取到key list ,寫入到buffer中,然後再去資料檔案中提取資料,由於myisam使用堆表,對於每行資料都可以認為是隨機訪問,但由於在key list中 myisam對其進行了排序優化,所以訪問資料時,會產生很多連續的小片大量隨機io訪問,當使用者請求寫入資料時,將首先寫入資料檔案,隨即更新key檔案,最後將更新後的key寫入buffer中,完成整個資料訪問過程

1、使用key buffer時,判斷key是否在key buffer中,則直接獲取到key列表,key列表根據pos值進行排序後分段,然後定位到data中的pos值,拿到需要訪問的資料,返回給客戶端,因為輪詢key列表段,所以會有多次資料訪問,每輪詢乙個key list將導致handler_read_key增大,產生物理io

2、全部或部分key不在buffer中,會從物理索引中提取一次key列表,表現為key_reads增大,然後重複1的操作,在資料庫status中值為:key_reads , 它將產生至少一次key讀取io及至少一次物理資料io

3、寫入包含key的資料時,將先在資料檔案中寫入,然後寫入key,在資料庫status中值為:key_writes 加上至少在資料檔案中產生乙個io

4、訪問不到key時,將產生乙個全表掃瞄,它將訪問被篩選的每乙個字段,並將其中的select值捕獲,傳遞給mysql hanlder層, handler_read_rnd沒有使用到索引,導致需要全表掃瞄的值

引數列表:

key_reads 從硬碟讀取鍵的資料塊的次數,當key list不能在buffer中得到全部或部分時,將導致key io,他需要讀取key list 然後裝載到buffer中,並隨即定位資料檔案,至少產生兩次物理io

key_writes 向硬碟寫入將鍵的資料塊的物理寫操作的次數,每寫入一次key , 必定先造成一次資料檔案更新,並隨即產生key更新

key_read_requests 從key buffer中讀取key list的次數,再在資料檔案中移動指標得到資料,它至少產生一次物理io 請求(myisam為索引順序訪問,所以在這裡也做了訪問優化)

myisam總結:

myisam io計量目前為止,不能捕獲到精準的數值,但可以拿到模糊的值,因此下面的公式也代表了使用者的io開銷

計算公式

key_reads  * 2 +  key_writes * 2 + key_read_requests

訪問流程:

使用者發起請求,mysql解析並構造解析樹和優化樹,隨即呼叫hanlder介面,將請求分發給innodb,因為innodb由索引組織表構成,所以索引及資料都被倒掛在樹下,所以對待索引和資料的方式是一致的,innodb根據優化器指示,在buffer中探尋index,並找出主鍵id,根據主鍵id在buffer中探尋資料,如果資料不存在於buffer,則需要到資料檔案中將所在page裝載進buffer,但對於blob,text,特大的varchar等物件,將會產生乙個連線,不會直接裝載,然後在記憶體中根據二分查詢法查詢資料,並將結果集返回給hanlder

1、  當innodb query乙個資料時,將會判斷資料是否在記憶體中,在很多情況下,資料的一部分位於磁碟上,但status值innodb_data_reads將增加

2、  當使用者進行資料更新或資料ddl時,將會對innodb_data_writes,innodb_dblwr_writes,innodb_log_writes產生影響

引數列表:

innodb_data_reads資料讀請求量數量,包含 dic ,data,undo

innodb_data_writes資料寫請求量數量,包含 dic ,data,undo

innodb_dblwr_writes 雙寫請求數

innodb_log_writes 日誌redo寫請求數

innodb總結:

innodb寫入資料時,將盡可能產生為順序寫,這點和myisam不同,由於資料被merge寫入,會產生順序io,順序io被寫入redo後,又經過merge刷寫物理資料檔案,所以提公升了寫入能力,但也帶來了額外寫和額外的刷寫操作。由於使用了buffer,可以提公升讀效能。

innodb計算io公式

innodb_data_reads + innodb_data_writes + innodb_dblwr_writes + innodb_log_writes

instance io統計方法一共分兩種:

key_reads  * 2 +  key_writes * 2 + key_read_requests + innodb_data_reads + innodb_data_writes + innodb_dblwr_writes + innodb_log_writes

說明:以上為mysql的內部io統計,不涉及到具體物理io統計,但能從另一面反映出資料庫io使用量,通過結合物理io進行對比,可以對資料庫進行進一步優化

內部類 成員內部類 區域性內部類 匿名內部類

public class 外部類 private int num 0 外部類如果要訪問內部類的成員,則需要通過內部類的物件訪問 使用方式 1.外部類使用內部類,主函式再使用外部類 2.通過new的方式 外部類.內部類 物件名 new 外部類 new 內部類 定義在方法內部的類,就是區域性內部類,只有...

內部類(成員內部類 靜態內部類 方法內部類)

一 成員內部類 最常見的內部類就是成員內部類,也稱作普通內部類 2 inner類中定義的test 方法可以訪問outer類中的資料,不受訪問控制符的影響。3 定義了成員內部類後,必須使用外部類物件來建立內部類物件,而不能直接去 new 乙個內部類物件,即 內部類 物件名 外部類物件.new 內部類 ...

成員內部類,區域性內部類,靜態內部類,匿名內部類

成員內部類 class demo1 innerclass a 內部類概述 b 內部類訪問特點 a 內部類可以直接訪問外部類的成員,包括私有。b 外部類要訪問內部類的成員,必須建立物件。外部類名.內部類名 物件名 外部類物件.內部類物件 class outer class demo2 innercla...