磁盘文件读写和数据库读写哪个效率更高
假定在程序效率和關(guān)鍵過程相當且不計入緩存等措施的條件下,讀寫任何類型的數(shù)據(jù)都沒有直接操作文件來的快,不論MSYQL過程如何,最后都要到磁盤上去讀這個“文件”(記錄存儲區(qū)等效),所以當然這一切的前提是只讀 內(nèi)容,無關(guān)任何排序或查找操作。
動態(tài)網(wǎng)站一般都是用數(shù)據(jù)庫來存儲信息,如果信息的及時性要求不高 可以加入緩存來減少頻繁讀寫數(shù)據(jù)庫。
兩種方式一般都支持,但是繞過操作系統(tǒng)直接操作磁盤的性能較高,而且安全性也較高,數(shù)據(jù)庫中的磁盤性能一直都是瓶頸,大型數(shù)據(jù)庫一般基于unix系統(tǒng),當然win下也有,不常用應為win的不可靠性,unix下,用的是裸設(shè)備raw設(shè)備,就是沒有加工過的設(shè)備(unix下的磁盤分區(qū)屬于特殊設(shè)備,以文件形式統(tǒng)一管理),由dbms直接管理,不通過操作系統(tǒng),效率很高,可靠性也高,因為磁盤,cache和內(nèi)存都是自己管理的,大型數(shù)據(jù)庫系統(tǒng)db2,oracal,informix(不太流行了),mssql算不上大型數(shù)據(jù)庫系統(tǒng)。
1、直接讀文件相比數(shù)據(jù)庫查詢效率更勝一籌,而且文中還沒算上連接和斷開的時間。
2、一次讀取的內(nèi)容越大,直接讀文件的優(yōu)勢會越明顯(讀文件時間都是小幅增長,這跟文件存儲的連續(xù)性和簇大小等有關(guān)系),MYSQL對更大文件讀取可能又附加了某些操作(兩次時間增長了近30%),如果只是單純的賦值轉(zhuǎn)換應該是差異偏小才對。
3、寫文件和INSERT幾乎不用測試就可以推測出,數(shù)據(jù)庫效率只會更差。
4、很小的配置文件如果不需要使用到數(shù)據(jù)庫特性,更加適合放到獨立文件里存取,無需單獨創(chuàng)建數(shù)據(jù)表或記錄,很大的文件比如圖片、音樂等采用文件存儲更為方便,只把路徑或縮略圖等索引信息放到數(shù)據(jù)庫里更合理一些。
?
磁盤讀寫與數(shù)據(jù)庫的關(guān)系:
一 磁盤物理結(jié)構(gòu)
(1) 盤片:硬盤的盤體由多個盤片疊在一起構(gòu)成。
在硬盤出廠時,由硬盤生產(chǎn)商完成了低級格式化(物理格式化),作用是將空白的盤片(Platter)劃分為一個個同圓心、不同半徑的磁道(Track),還將磁道劃分為若干個扇區(qū)(Sector),每個扇區(qū)可存儲128×2的N次方(N=0.1.2.3)字節(jié)信息,默認每個扇區(qū)的大小為
512字節(jié)。通常使用者無需再進行低級格式化操作。
(2) 磁頭:每張盤片的正反兩面各有一個磁頭。
(3) 主軸:所有磁片都由主軸電機帶動旋轉(zhuǎn)。
(4) 控制集成電路板:復雜!上面還有ROM(內(nèi)有軟件系統(tǒng))、Cache等。
二 磁盤如何完成單次IO操作
(1) 尋道
當控制器對磁盤發(fā)出一個IO操作命令的時候,磁盤的驅(qū)動臂(Actuator Arm)帶動磁頭(Head)離開著陸區(qū)(Landing Zone,位于內(nèi)圈沒有數(shù)據(jù)的區(qū)域),移動到要操作的初始數(shù)據(jù)塊所在的磁道(Track)的正上方,這個過程被稱為尋道(Seeking),對應消耗的時
間被稱為尋道時間(Seek Time);
(2) 旋轉(zhuǎn)延遲
找到對應磁道還不能馬上讀取數(shù)據(jù),這時候磁頭要等到磁盤盤片(Platter)旋轉(zhuǎn)到初始數(shù)據(jù)塊所在的扇區(qū)(Sector)落在讀寫磁頭正下方之后才能開始讀取數(shù)據(jù),在這個等待盤片旋轉(zhuǎn)到可操作扇區(qū)的過程中消耗的時間稱為旋轉(zhuǎn)延時(Rotational Delay);
(3) 數(shù)據(jù)傳送
接下來就隨著盤片的旋轉(zhuǎn),磁頭不斷的讀/寫相應的數(shù)據(jù)塊,直到完成這次IO所需要操作的全部數(shù)據(jù),這個過程稱為數(shù)據(jù)傳送(Data Transfer),對應的時間稱為傳送時間(Transfer Time)。完成這三個步驟之后單次IO操作也就完成了。
根據(jù)磁盤單次IO操作的過程,可以發(fā)現(xiàn):
單次IO時間 = 尋道時間 + 旋轉(zhuǎn)延遲 + 傳送時間
進而推算IOPS(IO per second)的公式為:
IOPS = 1000ms/單次IO時間
三 磁盤IOPS計算
不同磁盤,它的尋道時間,旋轉(zhuǎn)延遲,數(shù)據(jù)傳送所需的時間各是多少?
1. 尋道時間
考慮到被讀寫的數(shù)據(jù)可能在磁盤的任意一個磁道,既有可能在磁盤的最內(nèi)圈(尋道時間最短),也可能在磁盤的最外圈(尋道時間最長),所以在計算中我們只考慮平均尋道時間。
在購買磁盤時,該參數(shù)都有標明,目前的SATA/SAS磁盤,按轉(zhuǎn)速不同,尋道時間不同,不過通常都在10ms以下:
2. 旋轉(zhuǎn)延時
和尋道一樣,當磁頭定位到磁道之后有可能正好在要讀寫扇區(qū)之上,這時候是不需要額外的延時就可以立刻讀寫到數(shù)據(jù),但是最壞的情況確實要磁盤旋轉(zhuǎn)整整
一圈之后磁頭才能讀取到數(shù)據(jù),所以這里也考慮的是平均旋轉(zhuǎn)延時,對于15000rpm的磁盤就是(60s/15000)*(1/2) = 2ms。
3. 傳送時間
(1) 磁盤傳輸速率
磁盤傳輸速率分兩種:內(nèi)部傳輸速率(Internal Transfer Rate),外部傳輸速率(External Transfer Rate)。
內(nèi)部傳輸速率(Internal Transfer Rate),是指磁頭與硬盤緩存之間的數(shù)據(jù)傳輸速率,簡單的說就是硬盤磁頭將數(shù)據(jù)從盤片上讀取出來,然后存儲在緩存內(nèi)的速度。
理想的內(nèi)部傳輸速率不存在尋道,旋轉(zhuǎn)延時,就一直在同一個磁道上讀數(shù)據(jù)并傳到緩存,顯然這是不可能的,因為單個磁道的存儲空間是有限的;
實際的內(nèi)部傳輸速率包含了尋道和旋轉(zhuǎn)延時,目前家用磁盤,穩(wěn)定的內(nèi)部傳輸速率一般在30MB/s到45MB/s之間(服務器磁盤,應該會更高)。
外部傳輸速率(External Transfer Rate),是指硬盤緩存和系統(tǒng)總線之間的數(shù)據(jù)傳輸速率,也就是計算機通過硬盤接口從緩存中將數(shù)據(jù)讀出交給相應的硬盤控制器的速率。
硬盤廠商在硬盤參數(shù)中,通常也會給出一個最大傳輸速率,比如現(xiàn)在SATA3.0的6Gbit/s,換算一下就是6*1024/8,768MB/s,通常指的是硬盤接口對外的最大傳輸速率,當然實際使用中是達不到這個值的。
這里計算IOPS,保守選擇實際內(nèi)部傳輸速率,以40M/s為例。
(2) 單次IO操作的大小
有了傳送速率,還要知道單次IO操作的大小(IO Chunk Size),才可以算出單次IO的傳送時間。那么磁盤單次IO的大小是多少?答案是:不確定。
操作系統(tǒng)為了提高 IO的性能而引入了文件系統(tǒng)緩存(File System Cache),系統(tǒng)會根據(jù)請求數(shù)據(jù)的情況將多個來自IO的請求先放在緩存里面,然后再一次性的提交給磁盤,也就是說對于數(shù)據(jù)庫發(fā)出的多個8K數(shù)據(jù)塊的讀操作有可能放在一個磁盤讀IO里就處理了。
還有,有些存儲系統(tǒng)也是提供了緩存(Cache),接收到操作系統(tǒng)的IO請求之后也是會將多個操作系統(tǒng)的 IO請求合并成一個來處理。
不管是操作系統(tǒng)層面的緩存還是磁盤控制器層面的緩存,目的都只有一個,提高數(shù)據(jù)讀寫的效率。因此每次單獨的IO操作大小都是不一樣的,它主要取決于系統(tǒng)對于數(shù)據(jù)讀寫效率的判斷。這里以SQL Server數(shù)據(jù)庫的數(shù)據(jù)頁大小為例:8K。
(3) 傳送時間
傳送時間 = IO Chunk Size/Internal Transfer Rate = 8k/40M/s = 0.2ms
可以發(fā)現(xiàn):
(3.1) 如果IO Chunk Size大的話,傳送時間會變大,從而導致IOPS變小;
(3.2) 機械磁盤的主要讀寫成本,都花在了尋址時間上,即:尋道時間 + 旋轉(zhuǎn)延遲,也就是磁盤臂的擺動,和磁盤的旋轉(zhuǎn)延遲。
(3.3) 如果粗略的計算IOPS,可以忽略傳送時間,1000ms/(尋道時間 + 旋轉(zhuǎn)延遲)即可。
4. IOPS計算示例
以15000rpm為例:
(1) 單次IO時間
單次IO時間 = 尋道時間 + 旋轉(zhuǎn)延遲 + 傳送時間 = 3ms + 2ms + 0.2 ms = 5.2 ms
(2) IOPS
IOPS = 1000ms/單次IO時間 = 1000ms/5.2ms = 192 (次)
這里計算的是單塊磁盤的隨機訪問IOPS。
考慮一種極端的情況,如果磁盤全部為順序訪問,那么就可以忽略:尋道時間 + 旋轉(zhuǎn)延遲 的時長,IOPS的計算公式就變?yōu)?#xff1a;IOPS = 1000ms/傳送時間
IOPS = 1000ms/傳送時間= 1000ms/0.2ms = 5000 (次)
顯然這種極端的情況太過理想,畢竟每個磁道的空間是有限的,尋道時間 + 旋轉(zhuǎn)延遲 時長確實可以減少,不過是無法完全避免的。
四 數(shù)據(jù)庫中的磁盤讀寫
1. 隨機訪問和連續(xù)訪問
(1) 隨機訪問(Random Access)
指的是本次IO所給出的扇區(qū)地址和上次IO給出扇區(qū)地址相差比較大,這樣的話磁頭在兩次IO操作之間需要作比較大的移動動作才能重新開始讀/寫數(shù)據(jù)。
(2) 連續(xù)訪問(Sequential Access)
相反的,如果當次IO給出的扇區(qū)地址與上次IO結(jié)束的扇區(qū)地址一致或者是接近的話,那磁頭就能很快的開始這次IO操作,這樣的多個IO操作稱為連續(xù)訪問。
(3) 以SQL Server數(shù)據(jù)庫為例
數(shù)據(jù)文件,SQL Server統(tǒng)一區(qū)上的對象,是以extent(8*8k)為單位進行空間分配的,數(shù)據(jù)存放是很隨機的,哪個數(shù)據(jù)頁有空間,就寫在哪里,除非通過文件組給每個表預分配足夠大的、單獨使用的文件,否則不能保證數(shù)據(jù)的連續(xù)性,通常為隨機訪問。
另外哪怕聚集索引表,也只是邏輯上的連續(xù),并不是物理上。
日志文件,由于有VLF的存在,日志的讀寫理論上為連續(xù)訪問,但如果日志文件設(shè)置為自動增長,且增量不大,VLF就會很多很小,那么就也并不是嚴格的連續(xù)訪問了。
2. 順序IO和并發(fā)IO
(1) 順序IO模式(Queue Mode)
磁盤控制器可能會一次對磁盤組發(fā)出一連串的IO命令,如果磁盤組一次只能執(zhí)行一個IO命令,稱為順序IO;
(2) 并發(fā)IO模式(Burst Mode)
當磁盤組能同時執(zhí)行多個IO命令時,稱為并發(fā)IO。并發(fā)IO只能發(fā)生在由多個磁盤組成的磁盤組上,單塊磁盤只能一次處理一個IO命令。
(3) 以SQL Server數(shù)據(jù)庫為例
有的時候,盡管磁盤的IOPS(Disk Transfers/sec)還沒有太大,但是發(fā)現(xiàn)數(shù)據(jù)庫出現(xiàn)IO等待,為什么?通常是因為有了磁盤請求隊列,有過多的IO請求堆積。
磁盤的請求隊列和繁忙程度,通過以下性能計數(shù)器查看:
LogicalDisk/Avg.Disk Queue Length
LogicalDisk/Current Disk Queue Length
LogicalDisk/%Disk Time
這種情況下,可以做的是:
(1) 簡化業(yè)務邏輯,減少IO請求數(shù);
(2) 同一個實例下,多個數(shù)據(jù)庫遷移的不同實例下;
(3) 同一個數(shù)據(jù)庫的日志,數(shù)據(jù)文件分離到不同的存儲單元;
(4) 借助HA策略,做讀寫操作的分離。
3. IOPS和吞吐量(throughput)
(1) IOPS
IOPS即每秒進行讀寫(I/O)操作的次數(shù)。在計算傳送時間時,有提到,如果IO Chunk Size大的話,那么IOPS會變小,假設(shè)以100M為單位讀寫數(shù)據(jù),那么IOPS就會很小。
(2) 吞吐量(throughput)
吞吐量指每秒可以讀寫的字節(jié)數(shù)。同樣假設(shè)以100M為單位讀寫數(shù)據(jù),盡管IOPS很小,但是每秒讀寫了N*100M的數(shù)據(jù),吞吐量并不小。
(3) 以SQL Server數(shù)據(jù)庫為例
對于OLTP的系統(tǒng),經(jīng)常讀寫小塊數(shù)據(jù),多為隨機訪問,用IOPS來衡量讀寫性能;
對于數(shù)據(jù)倉庫,日志文件,經(jīng)常讀寫大塊數(shù)據(jù),多為順序訪問,用吞吐量來衡量讀寫性能。
磁盤當前的IOPS,通過以下性能計數(shù)器查看:
LogicalDisk/Disk Transfers/sec
LogicalDisk/Disk Reads/sec
LogicalDisk/Disk Writes/sec
磁盤當前的吞吐量,通過以下性能計數(shù)器查看:
LogicalDisk/Disk Bytes/sec
LogicalDisk/Disk Read Bytes/sec
LogicalDisk/Disk Write Bytes/sec
總結(jié)
以上是生活随笔為你收集整理的磁盘文件读写和数据库读写哪个效率更高的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: push_back和emplace_ba
- 下一篇: MySQL探秘(二):SQL语句执行过程