磁盤讀寫和數(shù)據(jù)庫(kù)讀寫哪個(gè)效率更高?磁盤讀寫與數(shù)據(jù)庫(kù)的關(guān)系

假定在程序效率和關(guān)鍵過(guò)程相當(dāng)且不計(jì)入緩存等措施的條件下,讀寫任何類型的數(shù)據(jù)都沒(méi)有直接操作文件來(lái)的快,不論MSYQL過(guò)程如何,最后都要到磁盤上去讀這個(gè)“文件”(記錄存儲(chǔ)區(qū)等效),所以當(dāng)然這一切的前提是只讀 內(nèi)容,無(wú)關(guān)任何排序或查找操作。
動(dòng)態(tài)網(wǎng)站一般都是用數(shù)據(jù)庫(kù)來(lái)存儲(chǔ)信息,如果信息的及時(shí)性要求不高 可以加入緩存來(lái)減少頻繁讀寫數(shù)據(jù)庫(kù)。
兩種方式一般都支持,但是繞過(guò)操作系統(tǒng)直接操作磁盤的性能較高,而且安全性也較高,數(shù)據(jù)庫(kù)系中的磁盤性能一直都是瓶頸,大型數(shù)據(jù)庫(kù)一般基于unix系統(tǒng),當(dāng)然win下也有,不常用應(yīng)為win的不可靠性,unix下,用的是裸設(shè)備raw設(shè)備,就是沒(méi)有加工過(guò)的設(shè)備(unix下的磁盤分區(qū)屬于特殊設(shè)備,以文件形式統(tǒng)一管理),由dbms直接管理,不通過(guò)操作系統(tǒng),效率很高,可靠性也高,因?yàn)榇疟P,cache和內(nèi)存都是自己管理的,大型數(shù)據(jù)庫(kù)系統(tǒng)db2,oracal,informix(不太流行了),mssql算不上大型數(shù)據(jù)庫(kù)系統(tǒng)。
1、直接讀文件相比數(shù)據(jù)庫(kù)查詢效率更勝一籌,而且文中還沒(méi)算上連接和斷開(kāi)的時(shí)間。
2、一次讀取的內(nèi)容越大,直接讀文件的優(yōu)勢(shì)會(huì)越明顯(讀文件時(shí)間都是小幅增長(zhǎng),這跟文件存儲(chǔ)的連續(xù)性和簇大小等有關(guān)系),這個(gè)結(jié)果恰恰跟書(shū)生預(yù)料的相反,說(shuō)明MYSQL對(duì)更大文件讀取可能又附加了某些操作(兩次時(shí)間增長(zhǎng)了近30%),如果只是單純的賦值轉(zhuǎn)換應(yīng)該是差異偏小才對(duì)。
3、寫文件和INSERT幾乎不用測(cè)試就可以推測(cè)出,數(shù)據(jù)庫(kù)效率只會(huì)更差。
4、很小的配置文件如果不需要使用到數(shù)據(jù)庫(kù)特性,更加適合放到獨(dú)立文件里存取,無(wú)需單獨(dú)創(chuàng)建數(shù)據(jù)表或記錄,很大的文件比如圖片、音樂(lè)等采用文件存儲(chǔ)更為方便,只把路徑或縮略圖等索引信息放到數(shù)據(jù)庫(kù)里更合理一些。
5、PHP上如果只是讀文件,file_get_contents比f(wàn)open、fclose更有效率,不包括判斷存在這個(gè)函數(shù)時(shí)間會(huì)少3秒左右。
6、fetch_row和fetch_object應(yīng)該是從fetch_array轉(zhuǎn)換而來(lái)的,書(shū)生沒(méi)看過(guò)PHP的源碼,單從執(zhí)行上就可以說(shuō)明fetch_array效率更高,這跟網(wǎng)上的說(shuō)法似乎相反。
磁盤讀寫與數(shù)據(jù)庫(kù)的關(guān)系:
一 磁盤物理結(jié)構(gòu)
(1) 盤片:硬盤的盤體由多個(gè)盤片疊在一起構(gòu)成。
在硬盤出廠時(shí),由硬盤生產(chǎn)商完成了低級(jí)格式化(物理格式化),作用是將空白的盤片(Platter)劃分為一個(gè)個(gè)同圓心、不同半徑的磁道(Track),還將磁道劃分為若干個(gè)扇區(qū)(Sector),每個(gè)扇區(qū)可存儲(chǔ)128×2的N次方(N=0.1.2.3)字節(jié)信息,默認(rèn)每個(gè)扇區(qū)的大小為512字節(jié)。通常使用者無(wú)需再進(jìn)行低級(jí)格式化操作。
(2) 磁頭:每張盤片的正反兩面各有一個(gè)磁頭。
(3) 主軸:所有磁片都由主軸電機(jī)帶動(dòng)旋轉(zhuǎn)。
(4) 控制集成電路板:復(fù)雜!上面還有ROM(內(nèi)有軟件系統(tǒng))、Cache等。
二 磁盤如何完成單次IO操作
(1) 尋道
當(dāng)控制器對(duì)磁盤發(fā)出一個(gè)IO操作命令的時(shí)候,磁盤的驅(qū)動(dòng)臂(Actuator Arm)帶動(dòng)磁頭(Head)離開(kāi)著陸區(qū)(Landing Zone,位于內(nèi)圈沒(méi)有數(shù)據(jù)的區(qū)域),移動(dòng)到要操作的初始數(shù)據(jù)塊所在的磁道(Track)的正上方,這個(gè)過(guò)程被稱為尋道(Seeking),對(duì)應(yīng)消耗的時(shí)間被稱為尋道時(shí)間(Seek Time);
(2) 旋轉(zhuǎn)延遲
找到對(duì)應(yīng)磁道還不能馬上讀取數(shù)據(jù),這時(shí)候磁頭要等到磁盤盤片(Platter)旋轉(zhuǎn)到初始數(shù)據(jù)塊所在的扇區(qū)(Sector)落在讀寫磁頭正下方之后才能開(kāi)始讀取數(shù)據(jù),在這個(gè)等待盤片旋轉(zhuǎn)到可操作扇區(qū)的過(guò)程中消耗的時(shí)間稱為旋轉(zhuǎn)延時(shí)(Rotational Delay);
(3) 數(shù)據(jù)傳送
接下來(lái)就隨著盤片的旋轉(zhuǎn),磁頭不斷的讀/寫相應(yīng)的數(shù)據(jù)塊,直到完成這次IO所需要操作的全部數(shù)據(jù),這個(gè)過(guò)程稱為數(shù)據(jù)傳送(Data Transfer),對(duì)應(yīng)的時(shí)間稱為傳送時(shí)間(Transfer Time)。完成這三個(gè)步驟之后單次IO操作也就完成了。
根據(jù)磁盤單次IO操作的過(guò)程,可以發(fā)現(xiàn):
單次IO時(shí)間 = 尋道時(shí)間 + 旋轉(zhuǎn)延遲 + 傳送時(shí)間
進(jìn)而推算IOPS(IO per second)的公式為:
IOPS = 1000ms/單次IO時(shí)間
三 磁盤IOPS計(jì)算
不同磁盤,它的尋道時(shí)間,旋轉(zhuǎn)延遲,數(shù)據(jù)傳送所需的時(shí)間各是多少?
1. 尋道時(shí)間
考慮到被讀寫的數(shù)據(jù)可能在磁盤的任意一個(gè)磁道,既有可能在磁盤的最內(nèi)圈(尋道時(shí)間最短),也可能在磁盤的最外圈(尋道時(shí)間最長(zhǎng)),所以在計(jì)算中我們只考慮平均尋道時(shí)間。
在購(gòu)買磁盤時(shí),該參數(shù)都有標(biāo)明,目前的SATA/SAS磁盤,按轉(zhuǎn)速不同,尋道時(shí)間不同,不過(guò)通常都在10ms以下:
3. 傳送時(shí)間2. 旋轉(zhuǎn)延時(shí)
和尋道一樣,當(dāng)磁頭定位到磁道之后有可能正好在要讀寫扇區(qū)之上,這時(shí)候是不需要額外的延時(shí)就可以立刻讀寫到數(shù)據(jù),但是最壞的情況確實(shí)要磁盤旋轉(zhuǎn)整整一圈之后磁頭才能讀取到數(shù)據(jù),所以這里也考慮的是平均旋轉(zhuǎn)延時(shí),對(duì)于15000rpm的磁盤就是(60s/15000)*(1/2) = 2ms。
(1) 磁盤傳輸速率
磁盤傳輸速率分兩種:內(nèi)部傳輸速率(Internal Transfer Rate),外部傳輸速率(External Transfer Rate)。
內(nèi)部傳輸速率(Internal Transfer Rate),是指磁頭與硬盤緩存之間的數(shù)據(jù)傳輸速率,簡(jiǎn)單的說(shuō)就是硬盤磁頭將數(shù)據(jù)從盤片上讀取出來(lái),然后存儲(chǔ)在緩存內(nèi)的速度。
理想的內(nèi)部傳輸速率不存在尋道,旋轉(zhuǎn)延時(shí),就一直在同一個(gè)磁道上讀數(shù)據(jù)并傳到緩存,顯然這是不可能的,因?yàn)閱蝹€(gè)磁道的存儲(chǔ)空間是有限的;
實(shí)際的內(nèi)部傳輸速率包含了尋道和旋轉(zhuǎn)延時(shí),目前家用磁盤,穩(wěn)定的內(nèi)部傳輸速率一般在30MB/s到45MB/s之間(服務(wù)器磁盤,應(yīng)該會(huì)更高)。
外部傳輸速率(External Transfer Rate),是指硬盤緩存和系統(tǒng)總線之間的數(shù)據(jù)傳輸速率,也就是計(jì)算機(jī)通過(guò)硬盤接口從緩存中將數(shù)據(jù)讀出交給相應(yīng)的硬盤控制器的速率。
硬盤廠商在硬盤參數(shù)中,通常也會(huì)給出一個(gè)最大傳輸速率,比如現(xiàn)在SATA3.0的6Gbit/s,換算一下就是6*1024/8,768MB/s,通常指的是硬盤接口對(duì)外的最大傳輸速率,當(dāng)然實(shí)際使用中是達(dá)不到這個(gè)值的。
這里計(jì)算IOPS,保守選擇實(shí)際內(nèi)部傳輸速率,以40M/s為例。
(2) 單次IO操作的大小
有了傳送速率,還要知道單次IO操作的大小(IO Chunk Size),才可以算出單次IO的傳送時(shí)間。那么磁盤單次IO的大小是多少?答案是:不確定。
操作系統(tǒng)為了提高 IO的性能而引入了文件系統(tǒng)緩存(File System Cache),系統(tǒng)會(huì)根據(jù)請(qǐng)求數(shù)據(jù)的情況將多個(gè)來(lái)自IO的請(qǐng)求先放在緩存里面,然后再一次性的提交給磁盤,也就是說(shuō)對(duì)于數(shù)據(jù)庫(kù)發(fā)出的多個(gè)8K數(shù)據(jù)塊的讀操作有可能放在一個(gè)磁盤讀IO里就處理了。
還有,有些存儲(chǔ)系統(tǒng)也是提供了緩存(Cache),接收到操作系統(tǒng)的IO請(qǐng)求之后也是會(huì)將多個(gè)操作系統(tǒng)的 IO請(qǐng)求合并成一個(gè)來(lái)處理。
不管是操作系統(tǒng)層面的緩存還是磁盤控制器層面的緩存,目的都只有一個(gè),提高數(shù)據(jù)讀寫的效率。因此每次單獨(dú)的IO操作大小都是不一樣的,它主要取決于系統(tǒng)對(duì)于數(shù)據(jù)讀寫效率的判斷。這里以SQL Server數(shù)據(jù)庫(kù)的數(shù)據(jù)頁(yè)大小為例:8K。
(3) 傳送時(shí)間
傳送時(shí)間 = IO Chunk Size/Internal Transfer Rate = 8k/40M/s = 0.2ms
可以發(fā)現(xiàn):
(3.1) 如果IO Chunk Size大的話,傳送時(shí)間會(huì)變大,從而導(dǎo)致IOPS變?。?br />(3.2) 機(jī)械磁盤的主要讀寫成本,都花在了尋址時(shí)間上,即:尋道時(shí)間 + 旋轉(zhuǎn)延遲,也就是磁盤臂的擺動(dòng),和磁盤的旋轉(zhuǎn)延遲。
(3.3) 如果粗略的計(jì)算IOPS,可以忽略傳送時(shí)間,1000ms/(尋道時(shí)間 + 旋轉(zhuǎn)延遲)即可。
4. IOPS計(jì)算示例
以15000rpm為例:
(1) 單次IO時(shí)間
單次IO時(shí)間 = 尋道時(shí)間 + 旋轉(zhuǎn)延遲 + 傳送時(shí)間 = 3ms + 2ms + 0.2 ms = 5.2 ms
(2) IOPS
IOPS = 1000ms/單次IO時(shí)間 = 1000ms/5.2ms = 192 (次)
這里計(jì)算的是單塊磁盤的隨機(jī)訪問(wèn)IOPS。
考慮一種極端的情況,如果磁盤全部為順序訪問(wèn),那么就可以忽略:尋道時(shí)間 + 旋轉(zhuǎn)延遲 的時(shí)長(zhǎng),IOPS的計(jì)算公式就變?yōu)椋篒OPS = 1000ms/傳送時(shí)間
IOPS = 1000ms/傳送時(shí)間= 1000ms/0.2ms = 5000 (次)
顯然這種極端的情況太過(guò)理想,畢竟每個(gè)磁道的空間是有限的,尋道時(shí)間 + 旋轉(zhuǎn)延遲 時(shí)長(zhǎng)確實(shí)可以減少,不過(guò)是無(wú)法完全避免的。
四 數(shù)據(jù)庫(kù)中的磁盤讀寫
1. 隨機(jī)訪問(wèn)和連續(xù)訪問(wèn)
(1) 隨機(jī)訪問(wèn)(Random Access)
指的是本次IO所給出的扇區(qū)地址和上次IO給出扇區(qū)地址相差比較大,這樣的話磁頭在兩次IO操作之間需要作比較大的移動(dòng)動(dòng)作才能重新開(kāi)始讀/寫數(shù)據(jù)。
(2) 連續(xù)訪問(wèn)(Sequential Access)
相反的,如果當(dāng)次IO給出的扇區(qū)地址與上次IO結(jié)束的扇區(qū)地址一致或者是接近的話,那磁頭就能很快的開(kāi)始這次IO操作,這樣的多個(gè)IO操作稱為連續(xù)訪問(wèn)。
(3) 以SQL Server數(shù)據(jù)庫(kù)為例
數(shù)據(jù)文件,SQL Server統(tǒng)一區(qū)上的對(duì)象,是以extent(8*8k)為單位進(jìn)行空間分配的,數(shù)據(jù)存放是很隨機(jī)的,哪個(gè)數(shù)據(jù)頁(yè)有空間,就寫在哪里,除非通過(guò)文件組給每個(gè)表預(yù)分配足夠大的、單獨(dú)使用的文件,否則不能保證數(shù)據(jù)的連續(xù)性,通常為隨機(jī)訪問(wèn)。
另外哪怕聚集索引表,也只是邏輯上的連續(xù),并不是物理上。
日志文件,由于有VLF的存在,日志的讀寫理論上為連續(xù)訪問(wèn),但如果日志文件設(shè)置為自動(dòng)增長(zhǎng),且增量不大,VLF就會(huì)很多很小,那么就也并不是嚴(yán)格的連續(xù)訪問(wèn)了。
2. 順序IO和并發(fā)IO
(1) 順序IO模式(Queue Mode)
磁盤控制器可能會(huì)一次對(duì)磁盤組發(fā)出一連串的IO命令,如果磁盤組一次只能執(zhí)行一個(gè)IO命令,稱為順序IO;
(2) 并發(fā)IO模式(Burst Mode)
當(dāng)磁盤組能同時(shí)執(zhí)行多個(gè)IO命令時(shí),稱為并發(fā)IO。并發(fā)IO只能發(fā)生在由多個(gè)磁盤組成的磁盤組上,單塊磁盤只能一次處理一個(gè)IO命令。
(3) 以SQL Server數(shù)據(jù)庫(kù)為例
有的時(shí)候,盡管磁盤的IOPS(Disk Transfers/sec)還沒(méi)有太大,但是發(fā)現(xiàn)數(shù)據(jù)庫(kù)出現(xiàn)IO等待,為什么?通常是因?yàn)橛辛舜疟P請(qǐng)求隊(duì)列,有過(guò)多的IO請(qǐng)求堆積。
磁盤的請(qǐng)求隊(duì)列和繁忙程度,通過(guò)以下性能計(jì)數(shù)器查看:
LogicalDisk/Avg.Disk Queue Length
LogicalDisk/Current Disk Queue Length
LogicalDisk/%Disk Time
這種情況下,可以做的是:
(1) 簡(jiǎn)化業(yè)務(wù)邏輯,減少IO請(qǐng)求數(shù);
(2) 同一個(gè)實(shí)例下,多個(gè)數(shù)據(jù)庫(kù)遷移的不同實(shí)例下;
(3) 同一個(gè)數(shù)據(jù)庫(kù)的日志,數(shù)據(jù)文件分離到不同的存儲(chǔ)單元;
(4) 借助HA策略,做讀寫操作的分離。
3. IOPS和吞吐量(throughput)
(1) IOPS
IOPS即每秒進(jìn)行讀寫(I/O)操作的次數(shù)。在計(jì)算傳送時(shí)間時(shí),有提到,如果IO Chunk Size大的話,那么IOPS會(huì)變小,假設(shè)以100M為單位讀寫數(shù)據(jù),那么IOPS就會(huì)很小。
(2) 吞吐量(throughput)
吞吐量指每秒可以讀寫的字節(jié)數(shù)。同樣假設(shè)以100M為單位讀寫數(shù)據(jù),盡管IOPS很小,但是每秒讀寫了N*100M的數(shù)據(jù),吞吐量并不小。
(3) 以SQL Server數(shù)據(jù)庫(kù)為例
對(duì)于OLTP的系統(tǒng),經(jīng)常讀寫小塊數(shù)據(jù),多為隨機(jī)訪問(wèn),用IOPS來(lái)衡量讀寫性能;
對(duì)于數(shù)據(jù)倉(cāng)庫(kù),日志文件,經(jīng)常讀寫大塊數(shù)據(jù),多為順序訪問(wèn),用吞吐量來(lái)衡量讀寫性能。
磁盤當(dāng)前的IOPS,通過(guò)以下性能計(jì)數(shù)器查看:
LogicalDisk/Disk Transfers/sec
LogicalDisk/Disk Reads/sec
LogicalDisk/Disk Writes/sec
磁盤當(dāng)前的吞吐量,通過(guò)以下性能計(jì)數(shù)器查看:
LogicalDisk/Disk Bytes/sec
LogicalDisk/Disk Read Bytes/sec
LogicalDisk/Disk Write Bytes/sec
相關(guān)文章
電腦提示找不到libcef.dll無(wú)法繼續(xù)執(zhí)行代碼怎么辦? libcef.dll丟失修復(fù)
在使用電腦的過(guò)程中,你可能會(huì)突然遇到諸如“找不到libcef.dll”或者“由于缺少libcef.dll,程序無(wú)法啟動(dòng)”之類的惱人提示,下面我們就來(lái)看看詳細(xì)解決辦法2025-04-23電腦提示由于找不到d3dx9_43.dll如何解決? d3dx9_43.dll文件丟失修復(fù)技
在使用Windows操作系統(tǒng)運(yùn)行某些應(yīng)用程序(尤其是游戲或圖形密集型軟件)時(shí),用戶可能會(huì)遇到“d3dx9_43.dll文件丟失”的錯(cuò)誤提示,這一錯(cuò)誤不僅影響程序的正常啟動(dòng),還可能2025-04-23電腦死機(jī)無(wú)反應(yīng)怎么強(qiáng)制重啟? 一文讀懂方法及注意事項(xiàng)
在日常使用電腦的過(guò)程中,我們難免會(huì)遇到電腦無(wú)法正常啟動(dòng)的情況,本文將詳細(xì)介紹幾種常見(jiàn)的電腦強(qiáng)制開(kāi)機(jī)方法,并探討在強(qiáng)制開(kāi)機(jī)后應(yīng)注意的事項(xiàng),以及如何從根本上解決電腦2025-04-16電腦如何通過(guò)數(shù)據(jù)線連接手機(jī)網(wǎng)絡(luò)? 電腦上網(wǎng)不再受限的技巧
今天我來(lái)分享一下如何用USB線把臺(tái)式電腦連接到手機(jī)的網(wǎng)絡(luò)上,其實(shí)操作非常簡(jiǎn)單,只需要幾步就搞定了,讓我們一起來(lái)看看吧2025-04-15分辨率三兄弟LPI、DPI 和 PPI有什么區(qū)別? 搞清分辨率的那些事兒
分辨率這個(gè)東西,真的是讓人又愛(ài)又恨,為了搞清楚它,我可是翻閱了不少資料,最后發(fā)現(xiàn)“小7的背包”的解釋最讓我茅塞頓開(kāi),于是,我決定整理一下,給大家分享一下我的理解2025-04-03空格符號(hào)怎么打? 全角空格和半角空格的區(qū)別介紹
你是否曾想過(guò),為什么鍵盤上的空格鍵有時(shí)并不能滿足我們的需求?其實(shí),空格鍵輸入的空格分為全角和半角兩種2025-03-31mss32.dll文件丟失怎么辦? 電腦提示mss32.dll丟失的多種修復(fù)方法
最近,很多電腦用戶可能遇到了mss32.dll文件丟失的問(wèn)題,導(dǎo)致一些應(yīng)用程序無(wú)法正常啟動(dòng),那么,如何修復(fù)這個(gè)問(wèn)題呢?別擔(dān)心,本文將詳細(xì)介紹mss32.dll文件的作用和丟失原因2025-03-26電腦提示找不到openal32.dll文件怎么辦? openal32.dll丟失完美修復(fù)方法
openal32.dll是一種重要的系統(tǒng)文件,當(dāng)它丟失時(shí),會(huì)給我們的電腦帶來(lái)很大的困擾,很多人都曾經(jīng)遇到過(guò)這個(gè)問(wèn)題,但你知道該如何解決嗎?詳細(xì)請(qǐng)看下文介紹2025-03-26電腦win32spl.dll文件丟失咋辦? win32spl.dll丟失無(wú)法連接打印機(jī)修復(fù)技
電腦突然提示win32spl.dll文件丟失,打印機(jī)死活連不上,今天就來(lái)給大家詳細(xì)講解一下這個(gè)問(wèn)題的解決方法,手把手教你如何搞定win32spl.dll丟失的問(wèn)題,讓你輕松恢復(fù)打印機(jī)連2025-03-26電腦提示binkw32.dll缺失怎么辦? 教你輕松解決binkw32.dll丟失問(wèn)題修復(fù)
電腦上玩游戲時(shí),突然彈出“計(jì)算機(jī)丟失binkw32.dll”的錯(cuò)誤提示,是不是讓你瞬間抓狂?別擔(dān)心,今天就來(lái)手把手教你如何解決這個(gè)問(wèn)題2025-03-26