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...