1. 程式人生 > >從資料庫層面理解:隨機 I/O & 順序 I/O

從資料庫層面理解:隨機 I/O & 順序 I/O

通常、我們把 <=16KB 的I/O認為是小I/O、而 >=32KB 的I/O認為是大I/O      瞭解I/O的大小、影響到後期對快取、RAID型別、LUN的一些屬性的調優            當前大多數資料庫使用的都是傳統的機械磁碟      因此、整個系統設計要儘可能順序I/O      避免昂貴的尋道時間和旋轉延遲的開銷      隨機小I/O消耗比順序大I/O更多的處理資源      隨機小I/O更在意系統處理I/O的數量、即IOPS、比如、OLTP      而順序大I/O則更在意頻寬、即MB/s、比如、OLAP      因此、如果系統承載了多種不同的應用      必須瞭解它們各自的需求、是對IOPS有要求、還是對頻寬有要求

     傳統機械磁碟最大的問題在於讀寫磁頭

     讀寫磁頭的存在可以讓磁碟既能順序I/O、也可隨機I/O

     但是、隨機I/O需要花費昂貴的磁頭旋轉和定位來查詢

     因此、順序IO訪問的速度遠遠快於隨機IO

     資料庫的很多設計也都是儘量充分利用順序IO、比如Oracle REDO LOG寫便是順序IO

     如果、資料庫伺服器同時使用順序和隨機I/O、隨機I/O從快取中受益最多      原因有 3 :      ① 順序I/O一般只需掃描一次資料、所以、快取對它用處不大      ② 順序I/O比隨機I/O快      ③ 隨機I/O通常只要查詢特定的行、但I/O的粒度是頁級的、其中大部分是浪費的           而、順序I/O所讀取的資料、通常發生在想要的資料塊上的所有行           更加符合成本效益      所以、快取隨機I/O可以節省更多的workload               傳統的資料庫架構對隨機IO幾乎沒有還手之力、隨機IO幾乎令所有DBA談虎色變      而聰明如MySQL InnoDB 則利用事務日誌把隨機I/O轉成順序I/O      如果能負擔得起、增加記憶體是解決隨機I/O最好的辦法