回表查詢為何是隨機 i/o
很多人誤以為回表查詢是順序 I/O,因為我們已知所查記錄的主鍵,從而可以定位到對應記錄的磁盤位置。但實際上這是錯誤的。
順序 I/O 和隨機 I/O 的關鍵區別在于數據布局。順序 I/O 指的是數據緊密相鄰地存儲在一起,而隨機 I/O 則指數據分散在不同的位置。絕大多數硬盤數據庫使用 B+ 樹作為索引,且 B+ 樹中的頁是在硬盤上隨機分布的。因此,當需要讀取多個頁時,幾乎總是需要隨機 I/O。
以 mysql Innodb 為例,每個頁的大小為 16KB,而頁在硬盤上的位置是隨機的。當需要跨頁查詢時,磁頭需要進行多次定位操作。因此,涉及多個頁的查詢被認為是隨機 I/O。
相比之下,hbase 的頁大小為 64MB,比 MySQL 大了 4000 倍。Hbase 使用 LSM 樹,這種數據結構充分利用了硬盤的順序讀寫特性,從而提高了查詢性能。
因此,回表查詢雖然利用了索引信息,但由于涉及多個隨機分布的頁,仍然被視為隨機 I/O。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END