資料庫和磁碟數據訪問
來自專欄 Java之鏈
MySQL中所有數據以文件的形式保存在磁碟上,而訪問磁碟是一個非常耗時的操作。所以資料庫和OS提供了緩衝池和內存來提高數據的訪問速度。
資料庫對數據的訪問不是以行為單位的,無論讀取一行還是多行,都是將該行所在的頁全部記載到內存中,然後在讀取對應的數據記錄。也可以從另外一個角度理解,讀取數據所消耗的時間與行數無關,而是與頁數有關。
這種數據訪問,讓我想起對磁碟數據的訪問,每次不會讀取一個扇區,而是讀取一個或者多個頁。同樣都是預讀取操作。
MySQL中,頁的大小一般是16KB,也有可能是其他值,這與存儲引擎相關。索引或者行記錄是否在緩存池中極大地影響了訪問索引或者數據的成本。
資料庫等待一個頁從磁碟讀取到緩衝池需要的時間大約是10ms(巨大的開銷)。
等待時間為 3ms、磁碟的實際繁忙時間約為 6ms,最終數據頁從磁碟傳輸到緩衝池的時間為 1ms 左右。
如果在資料庫的緩衝池中沒有找到相關的數據頁,那麼回去內存中尋找數據頁,時間約是1ms.
從磁碟讀取數據並不是都要付出很大的代價,當資料庫管理程序一次性從磁碟中順序讀取大量的數據時,讀取的速度會異常的快,大概在 40MB/s 左右。
如果一個頁面的大小為 4KB,那麼 1s 的時間就可以讀取 10000 個頁,讀取一個頁面所花費的平均時間就是 0.1ms,相比隨機讀取的 10ms 已經降低了兩個數量級,甚至比內存中讀取數據還要快。
數據頁面的順序讀取有兩個非常重要的優勢:
1)同時讀取多個界面意味著總時間的消耗會大幅度減少,磁碟的吞吐量可以達到 40MB/s;
2)資料庫管理程序會對一些即將使用的界面進行預讀,以減少查詢請求的等待和響應時間;
參考資料:MySQL 索引設計概要
推薦閱讀:
※資料庫 原理解析
※mysql查詢最近三個月的記錄
※從零開始實現資料庫系統(3)——並發控制
※電子取證——智能手機定位痕迹如何快速提取?
※2017年資料庫技術和市場盤點 :分散式架構下數據、業務多樣性支持成為未來方向王濤
TAG:資料庫 |