本申請(qǐng)涉及計(jì)算機(jī)領(lǐng)域,尤其涉及一種用于數(shù)據(jù)庫(kù)遍歷的技術(shù)。
背景技術(shù):
::在云數(shù)據(jù)庫(kù)場(chǎng)景下,多個(gè)用戶的數(shù)據(jù)庫(kù)實(shí)例會(huì)占用不同的內(nèi)存、cpu和iops(input/outputoperationspersecond,每秒進(jìn)行讀寫操作的次數(shù),表示訪問磁盤的頻率)等資源,有時(shí)需要遍歷用戶的數(shù)據(jù),一個(gè)典型的例子是在mysql數(shù)據(jù)庫(kù)場(chǎng)景下去遍歷用戶數(shù)據(jù)檢查用戶實(shí)例的主庫(kù)和其各個(gè)備庫(kù)是否存在數(shù)據(jù)不一致。如果是用戶去遍歷自己的數(shù)據(jù),當(dāng)然在其所購(gòu)買的資源限制范圍內(nèi),不會(huì)再另行限制,保證用戶用夠自己的資源;但是如果云計(jì)算的提供商想要遍歷用戶的數(shù)據(jù),就必須加以限制,例如,使其訪問不超過用戶購(gòu)買資源的指定百分比,而這樣的限制是已有的如cgroups等進(jìn)程級(jí)資源限制工具所無法滿足的,因?yàn)閷?duì)數(shù)據(jù)庫(kù)進(jìn)行遍歷往往是線程級(jí)或會(huì)話級(jí),且與用戶訪問是并行的,無法用進(jìn)程級(jí)訪問來進(jìn)行限制。而在數(shù)據(jù)庫(kù)遍歷的場(chǎng)景下,每次訪問的數(shù)據(jù)量是有限的,且不會(huì)有大量的計(jì)算,所以占用用戶的內(nèi)存和cpu是極少的,而占用的iops資源卻是十分明顯的。對(duì)于云計(jì)算的提供商而言,在與用戶并行訪問數(shù)據(jù)庫(kù)時(shí),如何在面對(duì)各種規(guī)格的云數(shù)據(jù)庫(kù)用戶以及各種類型的數(shù)據(jù)庫(kù)和表時(shí),控制遍歷時(shí)所用的iops,使其被限制在用戶所擁有資源的指定百分比內(nèi),不影響其他業(yè)務(wù),已成為關(guān)乎用戶體驗(yàn)的重要問題。為應(yīng)對(duì)該技術(shù)問題,現(xiàn)有的工具通常采用如下方法:(1)設(shè)置一個(gè)最大線程數(shù)max-load,當(dāng)連接到主庫(kù)并執(zhí)行sql的線程數(shù)超過該值時(shí),停止檢查數(shù)據(jù);(2)當(dāng)檢查的表為innodb時(shí),設(shè)置其鎖等待時(shí)間為1s,即當(dāng)用戶有引起鎖表的sql時(shí),若鎖表超過1s,會(huì)產(chǎn)生報(bào)警,從而中斷檢查;(3)設(shè)置一個(gè)最大塊行數(shù),當(dāng)要檢查的塊行數(shù)超過該值時(shí),跳過檢查當(dāng)前塊;(4)通過統(tǒng)計(jì)歷史平均行數(shù)來推測(cè)下一塊應(yīng)該的檢查行數(shù),這種推測(cè)不是表級(jí)別的,而是所有表所有分塊的平均行數(shù),即通過歷史平均行數(shù)和上一塊的行數(shù)加權(quán)來判斷當(dāng)前系統(tǒng)性能表現(xiàn),來決定下一塊行數(shù)。然而,現(xiàn)有的工具存在如下的缺點(diǎn):(1)屬于進(jìn)程級(jí)別的限制,而沒有對(duì)具體的用戶數(shù)據(jù)庫(kù)和表進(jìn)行具體的分析,只是通過評(píng)估數(shù)據(jù)庫(kù)實(shí)例進(jìn)程所能達(dá)到的速度,來推斷可以遍歷的數(shù)據(jù)塊行數(shù),存在不精確的問題,會(huì)打滿用戶的iops,這在云計(jì)算場(chǎng)景下會(huì)釀成大禍,且用戶的訪問與遍歷過程是并行的,單純?cè)u(píng)估實(shí)例整體的平均行數(shù),是不可靠的,無法準(zhǔn)確控制遍歷的速度。(2)限制最大可執(zhí)行sql的線程數(shù)max-load缺乏根據(jù),是一種猜測(cè)性比較重的自我保護(hù)措施,因?yàn)椴⒎菆?zhí)行sql的線程數(shù)越多,進(jìn)程的負(fù)載就越大,而應(yīng)該結(jié)合具體數(shù)據(jù)進(jìn)行分析,做到既不影響用戶,又能達(dá)到最佳的遍歷性能,不因線程數(shù)少而開啟遍歷,也不因線程數(shù)多而停止遍歷。(3)設(shè)置鎖等待超時(shí)時(shí)間的作用并不明朗,實(shí)際上,鎖等待超時(shí)時(shí)間能起到的作用是當(dāng)遍歷的sql與用戶的寫鎖沖突時(shí),放棄遍歷當(dāng)前塊,這是不合理的,也是無用的;因?yàn)閷?duì)innodb引擎而言,遍歷并不會(huì)與用戶的寫操作產(chǎn)生沖突的;對(duì)myisam引擎而言,該參數(shù)是無用的,而在myisam引擎下,遍歷會(huì)阻塞住用戶的寫操作;鎖等待超時(shí)并不能防止一個(gè)慢sql的發(fā)生,如果在遍歷中不慎發(fā)生了慢sql,這才是對(duì)用戶iops致命的,會(huì)打滿用戶的iops;無法在面對(duì)各種引擎、各種數(shù)據(jù)時(shí),在sql發(fā)出去之前就精確預(yù)估其執(zhí)行時(shí)間,在產(chǎn)生慢sql時(shí)僅僅是鎖超時(shí)時(shí)中斷其自己的sql。(4)設(shè)置最大塊行數(shù)的作用并不明顯,不同的數(shù)據(jù)庫(kù)表其每一行大小都不一樣,保存幾個(gè)整型的表每一行可能非常小,保存字符串的表每一行可能非常長(zhǎng),全局而論行數(shù)是不合理的,因?yàn)閴K行數(shù)過大而跳過檢查,無法自適應(yīng)調(diào)節(jié)的塊行數(shù)來繼續(xù)檢查。(5)在該工具的數(shù)據(jù)檢查系統(tǒng)中,缺乏具備嚴(yán)密理論依據(jù)的索引選擇算法,只是片面地選擇唯一索引或主索引,另外,該工具對(duì)沒有唯一索引的表簡(jiǎn)單地進(jìn)行了放棄,這在云計(jì)算場(chǎng)景下是對(duì)用戶數(shù)據(jù)的不負(fù)責(zé)任。綜上,現(xiàn)有技術(shù)在進(jìn)行數(shù)據(jù)庫(kù)遍歷時(shí),控制iops資源占比的方法不夠精確、細(xì)致、安全,且存在一些不起實(shí)際作用的設(shè)定,影響用戶體驗(yàn)。技術(shù)實(shí)現(xiàn)要素:本申請(qǐng)的一個(gè)目的是提供一種用于數(shù)據(jù)庫(kù)遍歷的方法與設(shè)備,以解決在遍歷過程中控制iops資源的問題。根據(jù)本申請(qǐng)的一個(gè)方面,提供了一種數(shù)據(jù)庫(kù)遍歷方法,包括:獲取數(shù)據(jù)庫(kù)中待遍歷的數(shù)據(jù)表所對(duì)應(yīng)的目標(biāo)索引;基于所述目標(biāo)索引對(duì)所述數(shù)據(jù)表中的各數(shù)據(jù)塊執(zhí)行塊遍歷操作,并在遍歷所述數(shù)據(jù)表的過程中,根據(jù)所述數(shù)據(jù)表中當(dāng)前數(shù)據(jù)塊被塊遍歷后的sql執(zhí)行時(shí)間信息確定所述數(shù)據(jù)表中下一數(shù)據(jù)塊的塊尺寸信息。根據(jù)本申請(qǐng)的另一個(gè)方面,提供了一種數(shù)據(jù)庫(kù)遍歷設(shè)備,包括:獲取裝置,用于獲取數(shù)據(jù)庫(kù)中待遍歷的數(shù)據(jù)表所對(duì)應(yīng)的目標(biāo)索引;塊遍歷裝置,用于基于所述目標(biāo)索引對(duì)所述數(shù)據(jù)表中的各數(shù)據(jù)塊執(zhí)行塊遍歷操作,并在遍歷所述數(shù)據(jù)表的過程中,根據(jù)所述數(shù)據(jù)表中當(dāng)前數(shù)據(jù)塊被塊遍歷后的sql執(zhí)行時(shí)間信息確定所述數(shù)據(jù)表中下一數(shù)據(jù)塊的塊尺寸信息。此外,本申請(qǐng)還提供了一種數(shù)據(jù)庫(kù)遍歷設(shè)備,包括:處理器;以及被安排成存儲(chǔ)計(jì)算機(jī)可執(zhí)行指令的存儲(chǔ)器,所述可執(zhí)行指令在被執(zhí)行時(shí)使所述處理器:獲取數(shù)據(jù)庫(kù)中待遍歷的數(shù)據(jù)表所對(duì)應(yīng)的目標(biāo)索引;以及基于所述目標(biāo)索引對(duì)所述數(shù)據(jù)表中的各數(shù)據(jù)塊執(zhí)行塊遍歷操作,并在遍歷所述數(shù)據(jù)表的過程中,根據(jù)所述數(shù)據(jù)表中當(dāng)前數(shù)據(jù)塊被塊遍歷后的sql執(zhí)行時(shí)間信息確定所述數(shù)據(jù)表中下一數(shù)據(jù)塊的塊尺寸信息。與現(xiàn)有技術(shù)相比,本申請(qǐng)先獲取數(shù)據(jù)庫(kù)中待遍歷的數(shù)據(jù)表所對(duì)應(yīng)的目標(biāo)索引,其中,通過所述目標(biāo)索引進(jìn)行遍歷時(shí)的iops最小;然后,基于所述目標(biāo)索引對(duì)所述數(shù)據(jù)表中的各數(shù)據(jù)塊執(zhí)行塊遍歷操作,并在遍歷所述數(shù)據(jù)表的過程中,通過確定所述數(shù)據(jù)表中下一數(shù)據(jù)塊的塊尺寸信息來達(dá)到精確控制iops的目的,提升用戶體驗(yàn)。進(jìn)一步地,本申請(qǐng)?jiān)诋?dāng)前數(shù)據(jù)塊為所述數(shù)據(jù)表中的最后一塊時(shí),結(jié)束所述數(shù)據(jù)表的遍歷操作,從而避免遍歷進(jìn)入死循環(huán),提升安全性。進(jìn)一步地,本申請(qǐng)?jiān)诟鶕?jù)所述期望塊時(shí)間確定所述下一數(shù)據(jù)塊的塊尺寸信息中,當(dāng)增加所述下一數(shù)據(jù)塊的塊尺寸信息時(shí)采用緩慢增長(zhǎng),當(dāng)需要減少所述下一數(shù)據(jù)塊的塊尺寸信息時(shí)采用快速減小,來實(shí)現(xiàn)對(duì)iops更加精確的控制。附圖說明通過閱讀參照以下附圖所作的對(duì)非限制性實(shí)施例所作的詳細(xì)描述,本申請(qǐng)的其它特征、目的和優(yōu)點(diǎn)將會(huì)變得更明顯:圖1示出根據(jù)本申請(qǐng)一個(gè)方面的一種用于數(shù)據(jù)庫(kù)遍歷的方法流程圖;圖2示出根據(jù)本申請(qǐng)一個(gè)優(yōu)選實(shí)施例的一種用于數(shù)據(jù)庫(kù)遍歷的方法流程圖;圖3示出根據(jù)本申請(qǐng)另一個(gè)方面的一種用于數(shù)據(jù)庫(kù)遍歷的設(shè)備示意圖;圖4示出根據(jù)本申請(qǐng)一個(gè)優(yōu)選實(shí)施例的一種用于數(shù)據(jù)庫(kù)遍歷的設(shè)備示意圖;圖5示出了采用本申請(qǐng)實(shí)施例提供的方案對(duì)數(shù)據(jù)庫(kù)進(jìn)行遍歷時(shí)的處理過程示意圖;圖6示出了對(duì)數(shù)據(jù)庫(kù)進(jìn)行遍歷時(shí)選取目標(biāo)索引的過程示意圖;圖7示出了對(duì)數(shù)據(jù)表中的數(shù)據(jù)塊進(jìn)行遍歷的處理流程示意圖;圖8示出了對(duì)數(shù)據(jù)表中的數(shù)據(jù)塊進(jìn)行遍歷時(shí),根據(jù)不同情況確定相應(yīng)的緩沖信息的示意圖;圖9示出了本申請(qǐng)實(shí)施例提供的另一種數(shù)據(jù)庫(kù)遍歷設(shè)備的結(jié)構(gòu)示意圖;附圖中相同或相似的附圖標(biāo)記代表相同或相似的部件。具體實(shí)施方式下面結(jié)合附圖對(duì)本申請(qǐng)作進(jìn)一步詳細(xì)描述。在本申請(qǐng)一個(gè)典型的配置中,終端、服務(wù)網(wǎng)絡(luò)的設(shè)備和可信方均包括一個(gè)或多個(gè)處理器(cpu)、輸入/輸出接口、網(wǎng)絡(luò)接口和內(nèi)存。內(nèi)存可能包括計(jì)算機(jī)可讀介質(zhì)中的非永久性存儲(chǔ)器,隨機(jī)存取存儲(chǔ)器(ram)和/或非易失性內(nèi)存等形式,如只讀存儲(chǔ)器(rom)或閃存(flashram)。內(nèi)存是計(jì)算機(jī)可讀介質(zhì)的示例。計(jì)算機(jī)可讀介質(zhì)包括永久性和非永久性、可移動(dòng)和非可移動(dòng)媒體可以由任何方法或技術(shù)來實(shí)現(xiàn)信息存儲(chǔ)。信息可以是計(jì)算機(jī)可讀指令、數(shù)據(jù)結(jié)構(gòu)、程序的模塊或其他數(shù)據(jù)。計(jì)算機(jī)的存儲(chǔ)介質(zhì)的例子包括,但不限于相變內(nèi)存(pram)、靜態(tài)隨機(jī)存取存儲(chǔ)器(sram)、動(dòng)態(tài)隨機(jī)存取存儲(chǔ)器(dram)、其他類型的隨機(jī)存取存儲(chǔ)器(ram)、只讀存儲(chǔ)器(rom)、電可擦除可編程只讀存儲(chǔ)器(eeprom)、快閃記憶體或其他內(nèi)存技術(shù)、只讀光盤只讀存儲(chǔ)器(cd-rom)、數(shù)字多功能光盤(dvd)或其他光學(xué)存儲(chǔ)、磁盒式磁帶,磁帶磁盤存儲(chǔ)或其他磁性存儲(chǔ)設(shè)備或任何其他非傳輸介質(zhì),可用于存儲(chǔ)可以被計(jì)算設(shè)備訪問的信息。按照本文中的界定,計(jì)算機(jī)可讀介質(zhì)不包括非暫存電腦可讀媒體(transitorymedia),如調(diào)制的數(shù)據(jù)信號(hào)和載波。圖1示出根據(jù)本申請(qǐng)一個(gè)方面的一種用于數(shù)據(jù)庫(kù)遍歷的方法流程圖。該方法包括步驟s11和步驟s12。具體地,在步驟s11中,設(shè)備1獲取數(shù)據(jù)庫(kù)中待遍歷的數(shù)據(jù)表所對(duì)應(yīng)的目標(biāo)索引;在步驟s12中,設(shè)備1基于所述目標(biāo)索引對(duì)所述數(shù)據(jù)表中的各數(shù)據(jù)塊執(zhí)行塊遍歷操作,并在遍歷所述數(shù)據(jù)表的過程中,根據(jù)所述數(shù)據(jù)表中當(dāng)前數(shù)據(jù)塊被塊遍歷后的sql執(zhí)行時(shí)間信息確定所述數(shù)據(jù)表中下一數(shù)據(jù)塊的塊尺寸信息。在此,所述設(shè)備1包括但不限于用戶設(shè)備、網(wǎng)絡(luò)設(shè)備、或用戶設(shè)備與網(wǎng)絡(luò)設(shè)備通過網(wǎng)絡(luò)相集成所構(gòu)成的設(shè)備。所述用戶設(shè)備其包括但不限于任何一種可與用戶通過觸摸板進(jìn)行人機(jī)交互的移動(dòng)電子產(chǎn)品,例如智能手機(jī)、平板電腦等,所述移動(dòng)電子產(chǎn)品可以采用任意操作系統(tǒng),如android操作系統(tǒng)、ios操作系統(tǒng)等。其中,所述網(wǎng)絡(luò)設(shè)備包括一種能夠按照事先設(shè)定或存儲(chǔ)的指令,自動(dòng)進(jìn)行數(shù)值計(jì)算和信息處理的電子設(shè)備,其硬件包括但不限于微處理器、專用集成電路(asic)、可編程門陣列(fpga)、數(shù)字處理器(dsp)、嵌入式設(shè)備等。所述網(wǎng)絡(luò)設(shè)備其包括但不限于計(jì)算機(jī)、網(wǎng)絡(luò)主機(jī)、單個(gè)網(wǎng)絡(luò)服務(wù)器、多個(gè)網(wǎng)絡(luò)服務(wù)器集或多個(gè)服務(wù)器構(gòu)成的云;在此,云由基于云計(jì)算(cloudcomputing)的大量計(jì)算機(jī)或網(wǎng)絡(luò)服務(wù)器構(gòu)成,其中,云計(jì)算是分布式計(jì)算的一種,由一群松散耦合的計(jì)算機(jī)集組成的一個(gè)虛擬超級(jí)計(jì)算機(jī)。所述網(wǎng)絡(luò)包括但不限于互聯(lián)網(wǎng)、廣域網(wǎng)、城域網(wǎng)、局域網(wǎng)、vpn網(wǎng)絡(luò)、無線自組織網(wǎng)絡(luò)(adhoc網(wǎng)絡(luò))等。優(yōu)選地,設(shè)備1還可以是運(yùn)行于所述用戶設(shè)備、網(wǎng)絡(luò)設(shè)備、或用戶設(shè)備與網(wǎng)絡(luò)設(shè)備、網(wǎng)絡(luò)設(shè)備、觸摸終端或網(wǎng)絡(luò)設(shè)備與觸摸終端通過網(wǎng)絡(luò)相集成所構(gòu)成的設(shè)備上的腳本程序。當(dāng)然,本領(lǐng)域技術(shù)人員應(yīng)能理解上述設(shè)備1僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的設(shè)備1如可適用于本申請(qǐng),也應(yīng)包含在本申請(qǐng)保護(hù)范圍以內(nèi),并在此以引用方式包含于此。設(shè)備1的各個(gè)步驟之間是持續(xù)不斷工作的。具體地,在步驟s11中,設(shè)備1持續(xù)獲取數(shù)據(jù)庫(kù)中待遍歷的數(shù)據(jù)表所對(duì)應(yīng)的目標(biāo)索引;在步驟s12中,設(shè)備1持續(xù)基于所述目標(biāo)索引對(duì)所述數(shù)據(jù)表中的各數(shù)據(jù)塊執(zhí)行塊遍歷操作,并在遍歷所述數(shù)據(jù)表的過程中,根據(jù)所述數(shù)據(jù)表中當(dāng)前數(shù)據(jù)塊被塊遍歷后的sql執(zhí)行時(shí)間信息確定所述數(shù)據(jù)表中下一數(shù)據(jù)塊的塊尺寸信息;直至所述設(shè)備1停止工作。在步驟s11中,設(shè)備1獲取數(shù)據(jù)庫(kù)中待遍歷的數(shù)據(jù)表所對(duì)應(yīng)的目標(biāo)索引。在此,所述數(shù)據(jù)庫(kù)包括關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù),例如mysql數(shù)據(jù)庫(kù)(一種開放源代碼的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng))等。在本實(shí)施例中,主要以mysql數(shù)據(jù)庫(kù)及sql(structuredquerylanguage,結(jié)構(gòu)化查詢語(yǔ)言)語(yǔ)句為例進(jìn)行說明。當(dāng)然,本領(lǐng)域技術(shù)人員應(yīng)能理解上述mysql數(shù)據(jù)庫(kù)僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的數(shù)據(jù)庫(kù)如可適用于本申請(qǐng),也應(yīng)包含在本申請(qǐng)保護(hù)范圍以內(nèi),并在此以引用方式包含于此。在此,所述數(shù)據(jù)庫(kù)中包含若干個(gè)所述待遍歷的數(shù)據(jù)表。在優(yōu)選的實(shí)施例中,所述目標(biāo)索引包括遍歷時(shí)iops(input/outputoperationspersecond,每秒進(jìn)行讀寫操作的次數(shù),表示訪問磁盤的頻率)最小的索引,即按照所述目標(biāo)索引進(jìn)行數(shù)據(jù)庫(kù)遍歷時(shí)iops最小,消耗的磁盤資源最少。優(yōu)選地,在步驟s11中,設(shè)備1若數(shù)據(jù)庫(kù)中待遍歷的數(shù)據(jù)表已存在所有字段非空的一個(gè)或多個(gè)唯一索引,則從所述一個(gè)或多個(gè)唯一索引中擇一作為所述數(shù)據(jù)表對(duì)應(yīng)的目標(biāo)索引;否則,為所述數(shù)據(jù)表建立唯一索引以作為所述目標(biāo)索引。例如,對(duì)于mysql數(shù)據(jù)庫(kù)的innodb引擎而言,每個(gè)數(shù)據(jù)表都有一個(gè)聚集索引(clusteredindex),數(shù)據(jù)表上的其余非聚集索引均為二級(jí)索引,又叫輔助索引。如果數(shù)據(jù)表上定義有主鍵,則該主鍵對(duì)應(yīng)的索引是聚集索引。在此,聚集索引即為所述目標(biāo)索引。因?yàn)榘凑斩?jí)索引進(jìn)行遍歷會(huì)回表到聚集索引,增加iops,只有按照聚集索引進(jìn)行遍歷才能使遍歷時(shí)的iops最小。如果用戶沒有為數(shù)據(jù)表定義主鍵時(shí),可以取第一個(gè)唯一(unique)索引且字段非空(notnull)列作為主鍵,innodb引擎將該主鍵對(duì)應(yīng)的所有字段非空的唯一索引作為聚集索引(即目標(biāo)索引)。其中,唯一索引是指與該索引相關(guān)聯(lián)的幾個(gè)字段組成的值在數(shù)據(jù)表中唯一。在此,所述待遍歷的數(shù)據(jù)表中所述所有字段非空的唯一索引可能不止一個(gè),可從所述一個(gè)或多個(gè)唯一索引中擇一作為所述數(shù)據(jù)表對(duì)應(yīng)的目標(biāo)索引。若不存在所有字段非空的唯一索引,則為所述數(shù)據(jù)表建立唯一索引(因?yàn)樵撍饕粚?duì)用戶公開,在此也稱其為隱式索引)以作為所述目標(biāo)索引。具體地,當(dāng)不存在所有字段非空的唯一索引時(shí),mysql數(shù)據(jù)庫(kù)內(nèi)部會(huì)生成一個(gè)帶有自增的id(標(biāo)識(shí)號(hào))的內(nèi)部索引以便于存儲(chǔ)數(shù)據(jù),在此,建立一個(gè)帶有自增的6字節(jié)id的隱式索引,該隱式索引與mysql數(shù)據(jù)庫(kù)的內(nèi)部索引在關(guān)系上是連續(xù)且一一對(duì)應(yīng)的,按照所述隱式索引進(jìn)行遍歷會(huì)回表到mysql數(shù)據(jù)庫(kù)的內(nèi)部索引,但是回表代價(jià)極低,可以認(rèn)為按照所述隱式索引進(jìn)行遍歷時(shí)的iops與按照mysql數(shù)據(jù)庫(kù)的內(nèi)部索引進(jìn)行遍歷時(shí)的iops幾乎相同。例如,對(duì)于mysql數(shù)據(jù)庫(kù)的myisam引擎而言,所有的索引不存在聚集索引和非聚集索引的區(qū)別,但是所有字段非空的唯一索引仍是遍歷時(shí)的最佳選擇,因?yàn)榘凑账凶侄畏强盏奈ㄒ凰饕M(jìn)行遍歷時(shí)掃描的數(shù)據(jù)量比按照其他普通索引進(jìn)行遍歷時(shí)少很多。其中,唯一索引是指與該索引相關(guān)聯(lián)的幾個(gè)字段組成的值在數(shù)據(jù)表中唯一。假設(shè)要遍歷一張數(shù)據(jù)表中的1000行記錄,如果采用所有字段非空的唯一索引會(huì)掃描1000行記錄;而采用一個(gè)普通索引可能會(huì)掃描10000行記錄,甚至是全表掃描,如此造成的iops將會(huì)很大。在此,所述待遍歷的數(shù)據(jù)表中所述所有字段非空的唯一索引可能不止一個(gè),可從所述一個(gè)或多個(gè)唯一索引中擇一作為所述數(shù)據(jù)表對(duì)應(yīng)的目標(biāo)索引。若不存在所有字段非空的唯一索引,則為所述數(shù)據(jù)表建立唯一索引(因?yàn)樵撍饕粚?duì)用戶公開,在此也稱其為隱式索引)以作為所述目標(biāo)索引。具體地,當(dāng)不存在所有字段非空的唯一索引時(shí),mysql數(shù)據(jù)庫(kù)內(nèi)部會(huì)生成一個(gè)帶有自增的id(標(biāo)識(shí)號(hào))的內(nèi)部索引以便于存儲(chǔ)數(shù)據(jù),在此,建立一個(gè)帶有自增的6字節(jié)id的隱式索引,該隱式索引與mysql數(shù)據(jù)庫(kù)的內(nèi)部索引不同,但在關(guān)系上是連續(xù)且一一對(duì)應(yīng)的,按照所述隱式索引進(jìn)行遍歷會(huì)回表到mysql數(shù)據(jù)庫(kù)的內(nèi)部索引,但是回表代價(jià)極低,可以認(rèn)為按照所述隱式索引進(jìn)行遍歷時(shí)的iops與按照mysql數(shù)據(jù)庫(kù)的內(nèi)部索引進(jìn)行遍歷時(shí)的iops幾乎相同。當(dāng)然,本領(lǐng)域技術(shù)人員應(yīng)能理解上述innodb引擎及myisam引擎僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的數(shù)據(jù)庫(kù)引擎如可適用于本申請(qǐng),也應(yīng)包含在本申請(qǐng)保護(hù)范圍以內(nèi),并在此以引用方式包含于此。在步驟s12中,設(shè)備1基于所述目標(biāo)索引對(duì)所述數(shù)據(jù)表中的各數(shù)據(jù)塊執(zhí)行塊遍歷操作,并在遍歷所述數(shù)據(jù)表的過程中,根據(jù)所述數(shù)據(jù)表中當(dāng)前數(shù)據(jù)塊被塊遍歷后的sql執(zhí)行時(shí)間信息確定所述數(shù)據(jù)表中下一數(shù)據(jù)塊的塊尺寸信息。在此,所述數(shù)據(jù)表中下一數(shù)據(jù)塊的塊尺寸信息包括下一數(shù)據(jù)塊包含的記錄行數(shù)信息;可以根據(jù)當(dāng)前數(shù)據(jù)塊的sql執(zhí)行時(shí)間信息確定下一數(shù)據(jù)塊的塊尺寸信息,在遍歷過程中實(shí)時(shí)調(diào)整所述下一數(shù)據(jù)塊的塊尺寸信息。并依次對(duì)各數(shù)據(jù)塊分別執(zhí)行塊遍歷操作,直至遍歷完最后一塊,結(jié)束對(duì)所述數(shù)據(jù)表的遍歷。優(yōu)選地,所述塊遍歷操作包括:基于所述目標(biāo)索引確定所述數(shù)據(jù)表中待遍歷的當(dāng)前數(shù)據(jù)塊的塊范圍信息,根據(jù)所述塊范圍信息遍歷所述當(dāng)前數(shù)據(jù)塊;若所述當(dāng)前數(shù)據(jù)塊為所述數(shù)據(jù)表中的最后一塊,結(jié)束所述數(shù)據(jù)表的遍歷操作;否則,對(duì)所述數(shù)據(jù)表中下一數(shù)據(jù)塊執(zhí)行塊遍歷操作。在此,根據(jù)所述塊范圍信息逐個(gè)遍歷各數(shù)據(jù)塊,直至遍歷完所述數(shù)據(jù)表中的全部數(shù)據(jù)塊,結(jié)束對(duì)所述數(shù)據(jù)表的遍歷。在優(yōu)選的實(shí)施例中,為避免重復(fù)遍歷已遍歷過的數(shù)據(jù)塊,進(jìn)入死循環(huán),可以采取如下措施:(1)不使用非唯一索引(該索引相關(guān)聯(lián)的幾個(gè)字段組成的值在表里不唯一)進(jìn)行數(shù)據(jù)遍歷;(2)在發(fā)現(xiàn)重復(fù)時(shí),結(jié)束對(duì)所述數(shù)據(jù)表的遍歷;(3)當(dāng)所述數(shù)據(jù)表中存儲(chǔ)的數(shù)據(jù)為字符串格式時(shí),為避免因亂碼進(jìn)入死循環(huán),可在查詢時(shí)設(shè)置正確的字符集(各數(shù)據(jù)庫(kù)類型不同),并采用二進(jìn)制、八進(jìn)制或十六進(jìn)制等形式讀取數(shù)據(jù),具體在mysql數(shù)據(jù)庫(kù)中則可采用hex語(yǔ)法。更優(yōu)選地,所述基于所述目標(biāo)索引確定所述數(shù)據(jù)表中待遍歷的當(dāng)前數(shù)據(jù)塊的塊范圍信息包括:基于所述目標(biāo)索引,以及所述數(shù)據(jù)表中待遍歷的當(dāng)前數(shù)據(jù)塊的起始位置信息、所述當(dāng)前數(shù)據(jù)塊的塊尺寸信息,確定當(dāng)前數(shù)據(jù)塊的塊范圍信息。例如,假設(shè)有一張如下結(jié)構(gòu)的數(shù)據(jù)表:createtable`wp_term_relationships`(`object_id`bigint(20)unsignednotnulldefault'0',`term_taxonomy_id`bigint(20)unsignednotnulldefault'0',`term_order`int(11)notnulldefault'0',primarykey(`object_id`,`term_taxonomy_id`),key`term_taxonomy_id`(`term_taxonomy_id`))engine=innodbdefaultcharset=utf8在該數(shù)據(jù)表中,由字段`object_id`和`term_taxonomy_id`組成的索引即為所述目標(biāo)索引。開始遍歷時(shí),首先,通過sql語(yǔ)句:select`object_id`,`term_taxonomy_id`from`wp_term_relationships`limit1;可以找到該數(shù)據(jù)表的第一行記錄作為第一個(gè)數(shù)據(jù)塊的下界(即當(dāng)前數(shù)據(jù)塊的起始位置信息)。接下來,需要找到第一個(gè)數(shù)據(jù)塊的上界,假設(shè)在遍歷初始化時(shí)設(shè)定第一個(gè)數(shù)據(jù)塊有n行(即所述當(dāng)前數(shù)據(jù)塊的尺寸信息)記錄,那么大于等于下界的前n行記錄中的最大值即為當(dāng)前(第一個(gè))數(shù)據(jù)塊的上界。假設(shè)通過上述sql語(yǔ)句找到的下界為(1,2),那么找上界也就是要找(`object_id`,`term_taxonomy_id`)>=(1,2)的前n行記錄中的最大值,在mysql數(shù)據(jù)庫(kù)中,可以通過如下的sql語(yǔ)句來實(shí)現(xiàn):where`object_id`>1or(where`object_id`=1and`term_taxonomy_id`>=2)limitn-1,2;其中,將大于等于下界(1,2)分成了兩種情況:一種是第一個(gè)字段`object_id`比1大;另一種是第一個(gè)字段`object_id`等于1,但是第二個(gè)字段`term_taxonomy_id`>=2。類似的,假定上界是(500,1000),小于等于上界也可以分成兩種情況:一種是第一個(gè)字段`object_id`比500??;另一種是第一個(gè)字段`object_id`等于500,但是第二個(gè)字段`term_taxonomy_id`<=1000。其中,“l(fā)imitn-1,2”指的是找到比下界大的第n行記錄和第n+1行記錄,這兩行記錄分別對(duì)應(yīng)當(dāng)前數(shù)據(jù)塊的上界和下一數(shù)據(jù)塊的下界。對(duì)于單字段索引或多字段索引,均可以采用類似方法確定所述塊范圍信息。在確定所述塊范圍信息后,可以通過如下的sql語(yǔ)句來進(jìn)行遍歷:where(`object_id`>1or(where`object_id`=1and`term_taxonomy_id`>=2))and(`object_id`<500or(where`object_id`=500and`term_taxonomy_id`<=1000))可以根據(jù)下一數(shù)據(jù)塊的下界和下一數(shù)據(jù)塊包含的記錄行數(shù)m,對(duì)下一數(shù)據(jù)塊執(zhí)行所述塊遍歷操作。并依此對(duì)所述數(shù)據(jù)表中的各數(shù)據(jù)塊執(zhí)行所述塊遍歷操作,直至遍歷完所述數(shù)據(jù)表中的全部數(shù)據(jù)塊。其中,若找不到下一數(shù)據(jù)塊的下界,則表示當(dāng)前數(shù)據(jù)塊即為所述數(shù)據(jù)表中的最后一塊,結(jié)束對(duì)所述數(shù)據(jù)表的遍歷。在此,可以根據(jù)具體需求選擇sql語(yǔ)句,在遍歷過程中獲取數(shù)據(jù)或校驗(yàn)主庫(kù)和備庫(kù)的數(shù)據(jù)是否一致。優(yōu)選地,在步驟s12中,設(shè)備1根據(jù)所述數(shù)據(jù)表中當(dāng)前數(shù)據(jù)塊被塊遍歷后的sql執(zhí)行時(shí)間信息確定所述當(dāng)前數(shù)據(jù)塊被塊遍歷后的緩沖信息。在此,所述當(dāng)前數(shù)據(jù)塊被塊遍歷后的緩沖信息包括sql執(zhí)行時(shí)間后的休眠時(shí)間。例如,對(duì)每一數(shù)據(jù)塊執(zhí)行所述塊遍歷操作的時(shí)間需盡量短,因?yàn)閟ql執(zhí)行時(shí)間越短,對(duì)用戶的影響越小,過量使用用戶io(input/output,讀寫操作)資源的可能性也就越低。若借助cgroups(controlgroups,是linux內(nèi)核提供的一種可以限制、記錄、隔離進(jìn)程組所使用的cpu、內(nèi)存、iops等物理資源的機(jī)制)來控制iops,假設(shè)每個(gè)sql執(zhí)行時(shí)間為0.1s,用戶的iops限制值為1000,每個(gè)sql至多占用100個(gè)io,若想把iops限制在100,只需在每個(gè)sql之后休眠9倍sql執(zhí)行時(shí)間即可。其中,在對(duì)數(shù)據(jù)庫(kù)的操作中,每個(gè)io能讀取的數(shù)據(jù)量一般是固定的,這個(gè)值不一定是操作系統(tǒng)的blocksize(塊大小)值,但肯定小于blocksize值,以mysql數(shù)據(jù)庫(kù)為例,每個(gè)io的數(shù)據(jù)量大小為16k字節(jié)。優(yōu)選地,所述根據(jù)所述數(shù)據(jù)表中當(dāng)前數(shù)據(jù)塊被塊遍歷后的sql執(zhí)行時(shí)間信息確定所述當(dāng)前數(shù)據(jù)塊被塊遍歷后的緩沖信息包括:根據(jù)塊遍歷的回表信息,以及所述數(shù)據(jù)表中當(dāng)前數(shù)據(jù)塊被塊遍歷后的sql執(zhí)行時(shí)間信息確定所述當(dāng)前數(shù)據(jù)塊被塊遍歷后的緩沖信息。例如,若遍歷當(dāng)前數(shù)據(jù)表時(shí)由于無合適索引等因素,可能會(huì)引起回表;如果找到合適的索引,則遍歷時(shí)無回表或者極少回表。對(duì)于mysql數(shù)據(jù)庫(kù)而言,若所述目標(biāo)索引為單字段索引,通常在遍歷時(shí)無回表或極少回表,則根據(jù)所述塊尺寸信息確定所述當(dāng)前數(shù)據(jù)塊被塊遍歷后的緩沖信息;若所述目標(biāo)索引為多字段索引,通常在遍歷時(shí)并不能將多個(gè)字段都用到數(shù)據(jù)定位上,可能造成較多回表,則借助cgroups來控制iops,并確定所述當(dāng)前數(shù)據(jù)塊被塊遍歷后的緩沖信息。更優(yōu)選地,所述根據(jù)塊遍歷的回表信息,以及所述數(shù)據(jù)表中當(dāng)前數(shù)據(jù)塊被塊遍歷后的sql執(zhí)行時(shí)間信息確定所述當(dāng)前數(shù)據(jù)塊被塊遍歷后的緩沖信息,包括:當(dāng)塊遍歷的回表次數(shù)低于預(yù)定閾值,根據(jù)所述當(dāng)前數(shù)據(jù)塊的塊尺寸信息確定對(duì)應(yīng)安全執(zhí)行時(shí)間信息,并根據(jù)所述安全執(zhí)行時(shí)間信息及所述sql執(zhí)行時(shí)間信息確定所述當(dāng)前數(shù)據(jù)塊被塊遍歷后的緩沖信息;或者,當(dāng)塊遍歷的回表次數(shù)高于預(yù)定閾值,根據(jù)所述sql執(zhí)行時(shí)間信息及對(duì)應(yīng)的iops期望信息確定所述當(dāng)前數(shù)據(jù)塊被塊遍歷后的緩沖信息。例如,若參數(shù)名execute_sql_time表示當(dāng)前數(shù)據(jù)塊的sql執(zhí)行時(shí)間,參數(shù)名current_chunk_size表示當(dāng)前數(shù)據(jù)塊包含的記錄行數(shù),參數(shù)名avg_row_length表示數(shù)據(jù)塊的行平均字節(jié)大小,參數(shù)名max_iops表示所述數(shù)據(jù)表對(duì)應(yīng)的用戶的最大iops限制值,參數(shù)名iops_rate表示期望使用的iops占所述數(shù)據(jù)表對(duì)應(yīng)的用戶的最大iops限制值的百分比(即iops期望信息),參數(shù)名bytes_per_io表示每個(gè)io(input/output,讀寫操作)所讀取的數(shù)據(jù)量字節(jié)大小,參數(shù)名limit_chunk_time表示安全執(zhí)行時(shí)間。當(dāng)塊遍歷的回表次數(shù)低于預(yù)定閾值(例如在mysql數(shù)據(jù)庫(kù)中所述目標(biāo)索引為單字段索引),則可根據(jù)公式limit_chunk_time=(current_chunk_size*avg_row_length)/(max_iops*iops_rate*bytes_per_io)預(yù)估所述安全執(zhí)行時(shí)間。如果參數(shù)execute_sql_time大于limit_chunk_time,則不需要緩沖;否則,需要緩沖limit_chunk_time–execute_sql_time,以保證遍歷操作的安全性。當(dāng)塊遍歷的回表次數(shù)高于預(yù)定閾值(例如在mysql數(shù)據(jù)庫(kù)中所述目標(biāo)索引為多字段索引),可以借助cgroups的控制,需要緩沖execute_sql_time*(1/iops_rate-1)。在此,cgroups是controlgroups的縮寫,是linux內(nèi)核提供的一種可以限制、記錄、隔離進(jìn)程組所使用的物理資源(如cpu、內(nèi)存、iops等)的機(jī)制。優(yōu)選地,所述根據(jù)所述數(shù)據(jù)表中當(dāng)前數(shù)據(jù)塊被塊遍歷后的sql執(zhí)行時(shí)間信息確定所述數(shù)據(jù)表中下一數(shù)據(jù)塊的塊尺寸信息還包括:根據(jù)所述sql執(zhí)行時(shí)間信息及所述當(dāng)前數(shù)據(jù)塊對(duì)應(yīng)的期望塊時(shí)間確定所述下一數(shù)據(jù)塊對(duì)應(yīng)的期望塊時(shí)間;根據(jù)所述期望塊時(shí)間確定所述下一數(shù)據(jù)塊的塊尺寸信息。例如,接上例,若參數(shù)名expect_chunk_time表示遍歷一數(shù)據(jù)塊時(shí)期望的sql執(zhí)行時(shí)間(即所述期望塊時(shí)間)。理想的sql執(zhí)行時(shí)間應(yīng)小于expect_chunk_time且無限接近于expect_chunk_time。在確定下一數(shù)據(jù)塊的塊尺寸信息之前,需先調(diào)整所述下一數(shù)據(jù)塊對(duì)應(yīng)的期望時(shí)間,然后通過公式expect_chunk_time*(max_iops*iops_rate*bytes_per_io)/avg_row_length計(jì)算得到下一數(shù)據(jù)塊所包含的記錄行數(shù)(即所述下一數(shù)據(jù)塊的塊尺寸信息)。更優(yōu)選地,所述根據(jù)所述期望塊時(shí)間確定所述下一數(shù)據(jù)塊的塊尺寸信息包括:增加所述下一數(shù)據(jù)塊的塊尺寸信息時(shí)采用緩慢增長(zhǎng);減少所述下一數(shù)據(jù)塊的塊尺寸信息時(shí)采用快速減小。例如,接上例,若遍歷當(dāng)前數(shù)據(jù)塊的sql執(zhí)行時(shí)間execute_sql_time不超過期望塊時(shí)間expect_chunk_time時(shí),需增加下一數(shù)據(jù)塊的記錄行數(shù)(即增加所述下一數(shù)據(jù)塊的塊尺寸信息);若遍歷當(dāng)前數(shù)據(jù)塊的sql執(zhí)行時(shí)間execute_sql_time超過期望塊時(shí)間expect_chunk_time時(shí),需減小下一數(shù)據(jù)塊的記錄行數(shù)(即減少所述下一數(shù)據(jù)塊的塊尺寸信息)。在此,因下一數(shù)據(jù)塊的記錄行數(shù)與所述下一數(shù)據(jù)塊對(duì)應(yīng)的期望時(shí)間成正比,故通過調(diào)整行數(shù)也可調(diào)整所述下一數(shù)據(jù)塊對(duì)應(yīng)的期望時(shí)間。在優(yōu)選的實(shí)施例中,在增加下一數(shù)據(jù)塊的記錄行數(shù)時(shí)不應(yīng)突增,而在減少下一數(shù)據(jù)塊的記錄行數(shù)時(shí)應(yīng)該突減,即增加所述下一數(shù)據(jù)塊的塊尺寸信息時(shí)采用緩慢增長(zhǎng),減少所述下一數(shù)據(jù)塊的塊尺寸信息時(shí)采用快速減小。在此,可以采用一個(gè)增長(zhǎng)序列,比如菲波拉切數(shù)列1、1+1、1+1+1、1+1+1+2、1+1+1+2+3、1+1+1+2+3+5……,假設(shè)第一個(gè)數(shù)據(jù)塊包含1行記錄,如需增加行數(shù)可以在第二個(gè)數(shù)據(jù)塊增加1行(即第二個(gè)數(shù)據(jù)塊包含2行記錄),假設(shè)還需增加行數(shù),可以在第三個(gè)數(shù)據(jù)塊增加1行(即第二個(gè)數(shù)據(jù)塊包含3行記錄),在第四個(gè)數(shù)據(jù)塊增加2行(即第二個(gè)數(shù)據(jù)塊包含5行記錄),依此類推。如果需要減少下一數(shù)據(jù)塊的記錄行數(shù),比如expect_chunk_time為0.1s,execute_sql_time為0.2s,current_chunk_size為1000行,則下一數(shù)據(jù)塊應(yīng)為500行,但是每次減小之后如果再增長(zhǎng),則又要從增長(zhǎng)數(shù)列的第一個(gè)值開始,即如果下一數(shù)據(jù)塊再增加行數(shù),應(yīng)為501行。圖2示出根據(jù)本申請(qǐng)一個(gè)優(yōu)選實(shí)施例的一種用于數(shù)據(jù)庫(kù)遍歷的方法流程圖。該方法包括步驟s11’、步驟s12’和步驟s13’。在此,步驟s11’、步驟s12’與圖1中步驟s11、步驟s12的內(nèi)容相同或基本相同,為簡(jiǎn)明起見,不再贅述。具體地,在步驟s13’中,設(shè)備1對(duì)所述數(shù)據(jù)庫(kù)中待遍歷的其他數(shù)據(jù)表執(zhí)行所述步驟s11’及步驟s12’。在此,依此對(duì)所述數(shù)據(jù)庫(kù)中的各個(gè)待遍歷的數(shù)據(jù)表執(zhí)行所述步驟s11’及步驟s12’,直至遍歷完所述數(shù)據(jù)庫(kù)中的全部待遍歷的數(shù)據(jù)表,結(jié)束對(duì)所述數(shù)據(jù)庫(kù)的遍歷。圖3示出根據(jù)本申請(qǐng)另一個(gè)方面的一種用于數(shù)據(jù)庫(kù)遍歷的設(shè)備1,其中,設(shè)備1包括獲取裝置11和塊遍歷裝置12。具體地,所述獲取裝置11獲取數(shù)據(jù)庫(kù)中待遍歷的數(shù)據(jù)表所對(duì)應(yīng)的目標(biāo)索引;所述塊遍歷裝置12基于所述目標(biāo)索引對(duì)所述數(shù)據(jù)表中的各數(shù)據(jù)塊執(zhí)行塊遍歷操作,并在遍歷所述數(shù)據(jù)表的過程中,根據(jù)所述數(shù)據(jù)表中當(dāng)前數(shù)據(jù)塊被塊遍歷后的sql執(zhí)行時(shí)間信息確定所述數(shù)據(jù)表中下一數(shù)據(jù)塊的塊尺寸信息。在此,所述設(shè)備1包括但不限于用戶設(shè)備、網(wǎng)絡(luò)設(shè)備、或用戶設(shè)備與網(wǎng)絡(luò)設(shè)備通過網(wǎng)絡(luò)相集成所構(gòu)成的設(shè)備。所述用戶設(shè)備其包括但不限于任何一種可與用戶通過觸摸板進(jìn)行人機(jī)交互的移動(dòng)電子產(chǎn)品,例如智能手機(jī)、平板電腦等,所述移動(dòng)電子產(chǎn)品可以采用任意操作系統(tǒng),如android操作系統(tǒng)、ios操作系統(tǒng)等。其中,所述網(wǎng)絡(luò)設(shè)備包括一種能夠按照事先設(shè)定或存儲(chǔ)的指令,自動(dòng)進(jìn)行數(shù)值計(jì)算和信息處理的電子設(shè)備,其硬件包括但不限于微處理器、專用集成電路(asic)、可編程門陣列(fpga)、數(shù)字處理器(dsp)、嵌入式設(shè)備等。所述網(wǎng)絡(luò)設(shè)備其包括但不限于計(jì)算機(jī)、網(wǎng)絡(luò)主機(jī)、單個(gè)網(wǎng)絡(luò)服務(wù)器、多個(gè)網(wǎng)絡(luò)服務(wù)器集或多個(gè)服務(wù)器構(gòu)成的云;在此,云由基于云計(jì)算(cloudcomputing)的大量計(jì)算機(jī)或網(wǎng)絡(luò)服務(wù)器構(gòu)成,其中,云計(jì)算是分布式計(jì)算的一種,由一群松散耦合的計(jì)算機(jī)集組成的一個(gè)虛擬超級(jí)計(jì)算機(jī)。所述網(wǎng)絡(luò)包括但不限于互聯(lián)網(wǎng)、廣域網(wǎng)、城域網(wǎng)、局域網(wǎng)、vpn網(wǎng)絡(luò)、無線自組織網(wǎng)絡(luò)(adhoc網(wǎng)絡(luò))等。優(yōu)選地,設(shè)備1還可以是運(yùn)行于所述用戶設(shè)備、網(wǎng)絡(luò)設(shè)備、或用戶設(shè)備與網(wǎng)絡(luò)設(shè)備、網(wǎng)絡(luò)設(shè)備、觸摸終端或網(wǎng)絡(luò)設(shè)備與觸摸終端通過網(wǎng)絡(luò)相集成所構(gòu)成的設(shè)備上的腳本程序。當(dāng)然,本領(lǐng)域技術(shù)人員應(yīng)能理解上述設(shè)備1僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的設(shè)備1如可適用于本申請(qǐng),也應(yīng)包含在本申請(qǐng)保護(hù)范圍以內(nèi),并在此以引用方式包含于此。上述各裝置之間是持續(xù)不斷工作的,在此,本領(lǐng)域技術(shù)人員應(yīng)理解“持續(xù)”是指上述各裝置分別實(shí)時(shí)地或者按照設(shè)定的或?qū)崟r(shí)調(diào)整的工作模式要求,例如所述獲取裝置11持續(xù)獲取數(shù)據(jù)庫(kù)中待遍歷的數(shù)據(jù)表所對(duì)應(yīng)的目標(biāo)索引;所述塊遍歷裝置12持續(xù)基于所述目標(biāo)索引對(duì)所述數(shù)據(jù)表中的各數(shù)據(jù)塊執(zhí)行塊遍歷操作,并在遍歷所述數(shù)據(jù)表的過程中,根據(jù)所述數(shù)據(jù)表中當(dāng)前數(shù)據(jù)塊被塊遍歷后的sql執(zhí)行時(shí)間信息確定所述數(shù)據(jù)表中下一數(shù)據(jù)塊的塊尺寸信息;直至所述設(shè)備1停止工作。所述獲取裝置11獲取數(shù)據(jù)庫(kù)中待遍歷的數(shù)據(jù)表所對(duì)應(yīng)的目標(biāo)索引。在此,所述數(shù)據(jù)庫(kù)包括關(guān)系型數(shù)據(jù)庫(kù)和非關(guān)系型數(shù)據(jù)庫(kù),例如mysql數(shù)據(jù)庫(kù)(一種開放源代碼的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng))等。在本實(shí)施例中,主要以mysql數(shù)據(jù)庫(kù)及sql(structuredquerylanguage,結(jié)構(gòu)化查詢語(yǔ)言)語(yǔ)句為例進(jìn)行說明。當(dāng)然,本領(lǐng)域技術(shù)人員應(yīng)能理解上述mysql數(shù)據(jù)庫(kù)僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的數(shù)據(jù)庫(kù)如可適用于本申請(qǐng),也應(yīng)包含在本申請(qǐng)保護(hù)范圍以內(nèi),并在此以引用方式包含于此。在此,所述數(shù)據(jù)庫(kù)中包含若干個(gè)所述待遍歷的數(shù)據(jù)表。在優(yōu)選的實(shí)施例中,所述目標(biāo)索引包括遍歷時(shí)iops(input/outputoperationspersecond,每秒進(jìn)行讀寫操作的次數(shù),表示訪問磁盤的頻率)最小的索引,即按照所述目標(biāo)索引進(jìn)行數(shù)據(jù)庫(kù)遍歷時(shí)iops最小,消耗的磁盤資源最少。優(yōu)選地,所述獲取裝置11若數(shù)據(jù)庫(kù)中待遍歷的數(shù)據(jù)表已存在所有字段非空的一個(gè)或多個(gè)唯一索引,則從所述一個(gè)或多個(gè)唯一索引中擇一作為所述數(shù)據(jù)表對(duì)應(yīng)的目標(biāo)索引;否則,為所述數(shù)據(jù)表建立唯一索引以作為所述目標(biāo)索引。例如,對(duì)于mysql數(shù)據(jù)庫(kù)的innodb引擎而言,每個(gè)數(shù)據(jù)表都有一個(gè)聚集索引(clusteredindex),數(shù)據(jù)表上的其余非聚集索引均為二級(jí)索引,又叫輔助索引。如果數(shù)據(jù)表上定義有主鍵,則該主鍵對(duì)應(yīng)的索引是聚集索引。在此,聚集索引即為所述目標(biāo)索引。因?yàn)榘凑斩?jí)索引進(jìn)行遍歷會(huì)回表到聚集索引,增加iops,只有按照聚集索引進(jìn)行遍歷才能使遍歷時(shí)的iops最小。如果用戶沒有為數(shù)據(jù)表定義主鍵時(shí),可以取第一個(gè)唯一(unique)索引且字段非空(notnull)列作為主鍵,innodb引擎將該主鍵對(duì)應(yīng)的所有字段非空的唯一索引作為聚集索引(即目標(biāo)索引)。其中,唯一索引是指與該索引相關(guān)聯(lián)的幾個(gè)字段組成的值在數(shù)據(jù)表中唯一。在此,所述待遍歷的數(shù)據(jù)表中所述所有字段非空的唯一索引可能不止一個(gè),可從所述一個(gè)或多個(gè)唯一索引中擇一作為所述數(shù)據(jù)表對(duì)應(yīng)的目標(biāo)索引。若不存在所有字段非空的唯一索引,則為所述數(shù)據(jù)表建立唯一索引(因?yàn)樵撍饕粚?duì)用戶公開,在此也稱其為隱式索引)以作為所述目標(biāo)索引。具體地,當(dāng)不存在所有字段非空的唯一索引時(shí),mysql數(shù)據(jù)庫(kù)內(nèi)部會(huì)生成一個(gè)帶有自增的id(標(biāo)識(shí)號(hào))的內(nèi)部索引以便于存儲(chǔ)數(shù)據(jù),在此,建立一個(gè)帶有自增的6字節(jié)id的隱式索引,該隱式索引與mysql數(shù)據(jù)庫(kù)的內(nèi)部索引在關(guān)系上是連續(xù)且一一對(duì)應(yīng)的,按照所述隱式索引進(jìn)行遍歷會(huì)回表到mysql數(shù)據(jù)庫(kù)的內(nèi)部索引,但是回表代價(jià)極低,可以認(rèn)為按照所述隱式索引進(jìn)行遍歷時(shí)的iops與按照mysql數(shù)據(jù)庫(kù)的內(nèi)部索引進(jìn)行遍歷時(shí)的iops幾乎相同。例如,對(duì)于mysql數(shù)據(jù)庫(kù)的myisam引擎而言,所有的索引不存在聚集索引和非聚集索引的區(qū)別,但是所有字段非空的唯一索引仍是遍歷時(shí)的最佳選擇,因?yàn)榘凑账凶侄畏强盏奈ㄒ凰饕M(jìn)行遍歷時(shí)掃描的數(shù)據(jù)量比按照其他普通索引進(jìn)行遍歷時(shí)少很多。其中,唯一索引是指與該索引相關(guān)聯(lián)的幾個(gè)字段組成的值在數(shù)據(jù)表中唯一。假設(shè)要遍歷一張數(shù)據(jù)表中的1000行記錄,如果采用所有字段非空的唯一索引會(huì)掃描1000行記錄;而采用一個(gè)普通索引可能會(huì)掃描10000行記錄,甚至是全表掃描,如此造成的iops將會(huì)很大。在此,所述待遍歷的數(shù)據(jù)表中所述所有字段非空的唯一索引可能不止一個(gè),可從所述一個(gè)或多個(gè)唯一索引中擇一作為所述數(shù)據(jù)表對(duì)應(yīng)的目標(biāo)索引。若不存在所有字段非空的唯一索引,則為所述數(shù)據(jù)表建立唯一索引(因?yàn)樵撍饕粚?duì)用戶公開,在此也稱其為隱式索引)以作為所述目標(biāo)索引。具體地,當(dāng)不存在所有字段非空的唯一索引時(shí),mysql數(shù)據(jù)庫(kù)內(nèi)部會(huì)生成一個(gè)帶有自增的id(標(biāo)識(shí)號(hào))的內(nèi)部索引以便于存儲(chǔ)數(shù)據(jù),在此,建立一個(gè)帶有自增的6字節(jié)id的隱式索引,該隱式索引與mysql數(shù)據(jù)庫(kù)的內(nèi)部索引不同,但在關(guān)系上是連續(xù)且一一對(duì)應(yīng)的,按照所述隱式索引進(jìn)行遍歷會(huì)回表到mysql數(shù)據(jù)庫(kù)的內(nèi)部索引,但是回表代價(jià)極低,可以認(rèn)為按照所述隱式索引進(jìn)行遍歷時(shí)的iops與按照mysql數(shù)據(jù)庫(kù)的內(nèi)部索引進(jìn)行遍歷時(shí)的iops幾乎相同。當(dāng)然,本領(lǐng)域技術(shù)人員應(yīng)能理解上述innodb引擎及myisam引擎僅為舉例,其他現(xiàn)有的或今后可能出現(xiàn)的數(shù)據(jù)庫(kù)引擎如可適用于本申請(qǐng),也應(yīng)包含在本申請(qǐng)保護(hù)范圍以內(nèi),并在此以引用方式包含于此。所述塊遍歷裝置12基于所述目標(biāo)索引對(duì)所述數(shù)據(jù)表中的各數(shù)據(jù)塊執(zhí)行塊遍歷操作,并在遍歷所述數(shù)據(jù)表的過程中,根據(jù)所述數(shù)據(jù)表中當(dāng)前數(shù)據(jù)塊被塊遍歷后的sql執(zhí)行時(shí)間信息確定所述數(shù)據(jù)表中下一數(shù)據(jù)塊的塊尺寸信息。在此,所述數(shù)據(jù)表中下一數(shù)據(jù)塊的塊尺寸信息包括下一數(shù)據(jù)塊包含的記錄行數(shù)信息;可以根據(jù)當(dāng)前數(shù)據(jù)塊的sql執(zhí)行時(shí)間信息確定下一數(shù)據(jù)塊的塊尺寸信息,在遍歷過程中實(shí)時(shí)調(diào)整所述下一數(shù)據(jù)塊的塊尺寸信息。并依次對(duì)各數(shù)據(jù)塊分別執(zhí)行塊遍歷操作,直至遍歷完最后一塊,結(jié)束對(duì)所述數(shù)據(jù)表的遍歷。優(yōu)選地,所述塊遍歷操作包括:基于所述目標(biāo)索引確定所述數(shù)據(jù)表中待遍歷的當(dāng)前數(shù)據(jù)塊的塊范圍信息,根據(jù)所述塊范圍信息遍歷所述當(dāng)前數(shù)據(jù)塊;若所述當(dāng)前數(shù)據(jù)塊為所述數(shù)據(jù)表中的最后一塊,結(jié)束所述數(shù)據(jù)表的遍歷操作;否則,對(duì)所述數(shù)據(jù)表中下一數(shù)據(jù)塊執(zhí)行塊遍歷操作。在此,根據(jù)所述塊范圍信息逐個(gè)遍歷各數(shù)據(jù)塊,直至遍歷完所述數(shù)據(jù)表中的全部數(shù)據(jù)塊,結(jié)束對(duì)所述數(shù)據(jù)表的遍歷。在優(yōu)選的實(shí)施例中,為避免重復(fù)遍歷已遍歷過的數(shù)據(jù)塊,進(jìn)入死循環(huán),可以采取如下措施:(1)不使用非唯一索引(該索引相關(guān)聯(lián)的幾個(gè)字段組成的值在表里不唯一)進(jìn)行數(shù)據(jù)遍歷;(2)在發(fā)現(xiàn)重復(fù)時(shí),結(jié)束對(duì)所述數(shù)據(jù)表的遍歷;(3)當(dāng)所述數(shù)據(jù)表中存儲(chǔ)的數(shù)據(jù)為字符串格式時(shí),為避免因亂碼進(jìn)入死循環(huán),可在查詢時(shí)設(shè)置正確的字符集(各數(shù)據(jù)庫(kù)類型不同),并采用二進(jìn)制、八進(jìn)制或十六進(jìn)制等形式讀取數(shù)據(jù),具體在mysql數(shù)據(jù)庫(kù)中則可采用hex語(yǔ)法。更優(yōu)選地,所述基于所述目標(biāo)索引確定所述數(shù)據(jù)表中待遍歷的當(dāng)前數(shù)據(jù)塊的塊范圍信息包括:基于所述目標(biāo)索引,以及所述數(shù)據(jù)表中待遍歷的當(dāng)前數(shù)據(jù)塊的起始位置信息、所述當(dāng)前數(shù)據(jù)塊的塊尺寸信息,確定當(dāng)前數(shù)據(jù)塊的塊范圍信息。例如,假設(shè)有一張如下結(jié)構(gòu)的數(shù)據(jù)表:createtable`wp_term_relationships`(`object_id`bigint(20)unsignednotnulldefault'0',`term_taxonomy_id`bigint(20)unsignednotnulldefault'0',`term_order`int(11)notnulldefault'0',primarykey(`object_id`,`term_taxonomy_id`),key`term_taxonomy_id`(`term_taxonomy_id`))engine=innodbdefaultcharset=utf8在該數(shù)據(jù)表中,由字段`object_id`和`term_taxonomy_id`組成的索引即為所述目標(biāo)索引。開始遍歷時(shí),首先,通過sql語(yǔ)句:select`object_id`,`term_taxonomy_id`from`wp_term_relationships`limit1;可以找到該數(shù)據(jù)表的第一行記錄作為第一個(gè)數(shù)據(jù)塊的下界(即當(dāng)前數(shù)據(jù)塊的起始位置信息)。接下來,需要找到第一個(gè)數(shù)據(jù)塊的上界,假設(shè)在遍歷初始化時(shí)設(shè)定第一個(gè)數(shù)據(jù)塊有n行(即所述當(dāng)前數(shù)據(jù)塊的尺寸信息)記錄,那么大于等于下界的前n行記錄中的最大值即為當(dāng)前(第一個(gè))數(shù)據(jù)塊的上界。假設(shè)通過上述sql語(yǔ)句找到的下界為(1,2),那么找上界也就是要找(`object_id`,`term_taxonomy_id`)>=(1,2)的前n行記錄中的最大值,在mysql數(shù)據(jù)庫(kù)中,可以通過如下的sql語(yǔ)句來實(shí)現(xiàn):where`object_id`>1or(where`object_id`=1and`term_taxonomy_id`>=2)limitn-1,2;其中,將大于等于下界(1,2)分成了兩種情況:一種是第一個(gè)字段`object_id`比1大;另一種是第一個(gè)字段`object_id`等于1,但是第二個(gè)字段`term_taxonomy_id`>=2。類似的,假定上界是(500,1000),小于等于上界也可以分成兩種情況:一種是第一個(gè)字段`object_id`比500小;另一種是第一個(gè)字段`object_id`等于500,但是第二個(gè)字段`term_taxonomy_id`<=1000。其中,“l(fā)imitn-1,2”指的是找到比下界大的第n行記錄和第n+1行記錄,這兩行記錄分別對(duì)應(yīng)當(dāng)前數(shù)據(jù)塊的上界和下一數(shù)據(jù)塊的下界。對(duì)于單字段索引或多字段索引,均可以采用類似方法確定所述塊范圍信息。在確定所述塊范圍信息后,可以通過如下的sql語(yǔ)句來進(jìn)行遍歷:where(`object_id`>1or(where`object_id`=1and`term_taxonomy_id`>=2))and(`object_id`<500or(where`object_id`=500and`term_taxonomy_id`<=1000))可以根據(jù)下一數(shù)據(jù)塊的下界和下一數(shù)據(jù)塊包含的記錄行數(shù)m,對(duì)下一數(shù)據(jù)塊執(zhí)行所述塊遍歷操作。并依此對(duì)所述數(shù)據(jù)表中的各數(shù)據(jù)塊執(zhí)行所述塊遍歷操作,直至遍歷完所述數(shù)據(jù)表中的全部數(shù)據(jù)塊。其中,若找不到下一數(shù)據(jù)塊的下界,則表示當(dāng)前數(shù)據(jù)塊即為所述數(shù)據(jù)表中的最后一塊,結(jié)束對(duì)所述數(shù)據(jù)表的遍歷。在此,可以根據(jù)具體需求選擇sql語(yǔ)句,在遍歷過程中獲取數(shù)據(jù)或校驗(yàn)主庫(kù)和備庫(kù)的數(shù)據(jù)是否一致。優(yōu)選地,所述塊遍歷裝置12根據(jù)所述數(shù)據(jù)表中當(dāng)前數(shù)據(jù)塊被塊遍歷后的sql執(zhí)行時(shí)間信息確定所述當(dāng)前數(shù)據(jù)塊被塊遍歷后的緩沖信息。在此,所述當(dāng)前數(shù)據(jù)塊被塊遍歷后的緩沖信息包括sql執(zhí)行時(shí)間后的休眠時(shí)間。例如,對(duì)每一數(shù)據(jù)塊執(zhí)行所述塊遍歷操作的時(shí)間需盡量短,因?yàn)閟ql執(zhí)行時(shí)間越短,對(duì)用戶的影響越小,過量使用用戶io(input/output,讀寫操作)資源的可能性也就越低。若借助cgroups(controlgroups,是linux內(nèi)核提供的一種可以限制、記錄、隔離進(jìn)程組所使用的cpu、內(nèi)存、iops等物理資源的機(jī)制)來控制iops,假設(shè)每個(gè)sql執(zhí)行時(shí)間為0.1s,用戶的iops限制值為1000,每個(gè)sql至多占用100個(gè)io,若想把iops限制在100,只需在每個(gè)sql之后休眠9倍sql執(zhí)行時(shí)間即可。其中,在對(duì)數(shù)據(jù)庫(kù)的操作中,每個(gè)io能讀取的數(shù)據(jù)量一般是固定的,這個(gè)值不一定是操作系統(tǒng)的blocksize(塊大小)值,但肯定小于blocksize值,以mysql數(shù)據(jù)庫(kù)為例,每個(gè)io的數(shù)據(jù)量大小為16k字節(jié)。優(yōu)選地,所述根據(jù)所述數(shù)據(jù)表中當(dāng)前數(shù)據(jù)塊被塊遍歷后的sql執(zhí)行時(shí)間信息確定所述當(dāng)前數(shù)據(jù)塊被塊遍歷后的緩沖信息包括:根據(jù)塊遍歷的回表信息,以及所述數(shù)據(jù)表中當(dāng)前數(shù)據(jù)塊被塊遍歷后的sql執(zhí)行時(shí)間信息確定所述當(dāng)前數(shù)據(jù)塊被塊遍歷后的緩沖信息。例如,若遍歷當(dāng)前數(shù)據(jù)表時(shí)由于無合適索引等因素,可能會(huì)引起回表;如果找到合適的索引,則遍歷時(shí)無回表或者極少回表。對(duì)于mysql數(shù)據(jù)庫(kù)而言,若所述目標(biāo)索引為單字段索引,通常在遍歷時(shí)無回表或極少回表,則根據(jù)所述塊尺寸信息確定所述當(dāng)前數(shù)據(jù)塊被塊遍歷后的緩沖信息;若所述目標(biāo)索引為多字段索引,通常在遍歷時(shí)并不能將多個(gè)字段都用到數(shù)據(jù)定位上,可能造成較多回表,則借助cgroups來控制iops,并確定所述當(dāng)前數(shù)據(jù)塊被塊遍歷后的緩沖信息。更優(yōu)選地,所述根據(jù)塊遍歷的回表信息,以及所述數(shù)據(jù)表中當(dāng)前數(shù)據(jù)塊被塊遍歷后的sql執(zhí)行時(shí)間信息確定所述當(dāng)前數(shù)據(jù)塊被塊遍歷后的緩沖信息,包括:當(dāng)塊遍歷的回表次數(shù)低于預(yù)定閾值,根據(jù)所述當(dāng)前數(shù)據(jù)塊的塊尺寸信息確定對(duì)應(yīng)安全執(zhí)行時(shí)間信息,并根據(jù)所述安全執(zhí)行時(shí)間信息及所述sql執(zhí)行時(shí)間信息確定所述當(dāng)前數(shù)據(jù)塊被塊遍歷后的緩沖信息;或者,當(dāng)塊遍歷的回表次數(shù)高于預(yù)定閾值,根據(jù)所述sql執(zhí)行時(shí)間信息及對(duì)應(yīng)的iops期望信息確定所述當(dāng)前數(shù)據(jù)塊被塊遍歷后的緩沖信息。例如,若參數(shù)名execute_sql_time表示當(dāng)前數(shù)據(jù)塊的sql執(zhí)行時(shí)間,參數(shù)名current_chunk_size表示當(dāng)前數(shù)據(jù)塊包含的記錄行數(shù),參數(shù)名avg_row_length表示數(shù)據(jù)塊的行平均字節(jié)大小,參數(shù)名max_iops表示所述數(shù)據(jù)表對(duì)應(yīng)的用戶的最大iops限制值,參數(shù)名iops_rate表示期望使用的iops占所述數(shù)據(jù)表對(duì)應(yīng)的用戶的最大iops限制值的百分比(即iops期望信息),參數(shù)名bytes_per_io表示每個(gè)io(input/output,讀寫操作)所讀取的數(shù)據(jù)量字節(jié)大小,參數(shù)名limit_chunk_time表示安全執(zhí)行時(shí)間。當(dāng)塊遍歷的回表次數(shù)低于預(yù)定閾值(例如在mysql數(shù)據(jù)庫(kù)中所述目標(biāo)索引為單字段索引),則可根據(jù)公式limit_chunk_time=(current_chunk_size*avg_row_length)/(max_iops*iops_rate*bytes_per_io)預(yù)估所述安全執(zhí)行時(shí)間。如果參數(shù)execute_sql_time大于limit_chunk_time,則不需要緩沖;否則,需要緩沖limit_chunk_time–execute_sql_time,以保證遍歷操作的安全性。當(dāng)塊遍歷的回表次數(shù)高于預(yù)定閾值(例如在mysql數(shù)據(jù)庫(kù)中所述目標(biāo)索引為多字段索引),可以借助cgroups的控制,需要緩沖execute_sql_time*(1/iops_rate-1)。在此,cgroups是controlgroups的縮寫,是linux內(nèi)核提供的一種可以限制、記錄、隔離進(jìn)程組所使用的物理資源(如cpu、內(nèi)存、iops等)的機(jī)制。優(yōu)選地,所述根據(jù)所述數(shù)據(jù)表中當(dāng)前數(shù)據(jù)塊被塊遍歷后的sql執(zhí)行時(shí)間信息確定所述數(shù)據(jù)表中下一數(shù)據(jù)塊的塊尺寸信息還包括:根據(jù)所述sql執(zhí)行時(shí)間信息及所述當(dāng)前數(shù)據(jù)塊對(duì)應(yīng)的期望塊時(shí)間確定所述下一數(shù)據(jù)塊對(duì)應(yīng)的期望塊時(shí)間;根據(jù)所述期望塊時(shí)間確定所述下一數(shù)據(jù)塊的塊尺寸信息。例如,接上例,若參數(shù)名expect_chunk_time表示遍歷一數(shù)據(jù)塊時(shí)期望的sql執(zhí)行時(shí)間(即所述期望塊時(shí)間)。理想的sql執(zhí)行時(shí)間應(yīng)小于expect_chunk_time且無限接近于expect_chunk_time。在確定下一數(shù)據(jù)塊的塊尺寸信息之前,需先調(diào)整所述下一數(shù)據(jù)塊對(duì)應(yīng)的期望時(shí)間,然后通過公式expect_chunk_time*(max_iops*iops_rate*bytes_per_io)/avg_row_length計(jì)算得到下一數(shù)據(jù)塊所包含的記錄行數(shù)(即所述下一數(shù)據(jù)塊的塊尺寸信息)。更優(yōu)選地,所述根據(jù)所述期望塊時(shí)間確定所述下一數(shù)據(jù)塊的塊尺寸信息包括:增加所述下一數(shù)據(jù)塊的塊尺寸信息時(shí)采用緩慢增長(zhǎng);減少所述下一數(shù)據(jù)塊的塊尺寸信息時(shí)采用快速減小。例如,接上例,若遍歷當(dāng)前數(shù)據(jù)塊的sql執(zhí)行時(shí)間execute_sql_time不超過期望塊時(shí)間expect_chunk_time時(shí),需增加下一數(shù)據(jù)塊的記錄行數(shù)(即增加所述下一數(shù)據(jù)塊的塊尺寸信息);若遍歷當(dāng)前數(shù)據(jù)塊的sql執(zhí)行時(shí)間execute_sql_time超過期望塊時(shí)間expect_chunk_time時(shí),需減小下一數(shù)據(jù)塊的記錄行數(shù)(即減少所述下一數(shù)據(jù)塊的塊尺寸信息)。在此,因下一數(shù)據(jù)塊的記錄行數(shù)與所述下一數(shù)據(jù)塊對(duì)應(yīng)的期望時(shí)間成正比,故通過調(diào)整行數(shù)也可調(diào)整所述下一數(shù)據(jù)塊對(duì)應(yīng)的期望時(shí)間。在優(yōu)選的實(shí)施例中,在增加下一數(shù)據(jù)塊的記錄行數(shù)時(shí)不應(yīng)突增,而在減少下一數(shù)據(jù)塊的記錄行數(shù)時(shí)應(yīng)該突減,即增加所述下一數(shù)據(jù)塊的塊尺寸信息時(shí)采用緩慢增長(zhǎng),減少所述下一數(shù)據(jù)塊的塊尺寸信息時(shí)采用快速減小。在此,可以采用一個(gè)增長(zhǎng)序列,比如菲波拉切數(shù)列1、1+1、1+1+1、1+1+1+2、1+1+1+2+3、1+1+1+2+3+5……,假設(shè)第一個(gè)數(shù)據(jù)塊包含1行記錄,如需增加行數(shù)可以在第二個(gè)數(shù)據(jù)塊增加1行(即第二個(gè)數(shù)據(jù)塊包含2行記錄),假設(shè)還需增加行數(shù),可以在第三個(gè)數(shù)據(jù)塊增加1行(即第二個(gè)數(shù)據(jù)塊包含3行記錄),在第四個(gè)數(shù)據(jù)塊增加2行(即第二個(gè)數(shù)據(jù)塊包含5行記錄),依此類推。如果需要減少下一數(shù)據(jù)塊的記錄行數(shù),比如expect_chunk_time為0.1s,execute_sql_time為0.2s,current_chunk_size為1000行,則下一數(shù)據(jù)塊應(yīng)為500行,但是每次減小之后如果再增長(zhǎng),則又要從增長(zhǎng)數(shù)列的第一個(gè)值開始,即如果下一數(shù)據(jù)塊再增加行數(shù),應(yīng)為501行。圖4示出根據(jù)本申請(qǐng)一個(gè)優(yōu)選實(shí)施例的一種用于數(shù)據(jù)庫(kù)遍歷的設(shè)備1,其中,設(shè)備1包括獲取裝置11’、塊遍歷裝置12’和執(zhí)行裝置13’。在此,所述獲取裝置11’、塊遍歷裝置12’與圖3中獲取裝置11、塊遍歷裝置12的內(nèi)容相同或基本相同,為簡(jiǎn)明起見,不再贅述。具體地,所述執(zhí)行裝置13’對(duì)所述數(shù)據(jù)庫(kù)中待遍歷的其他數(shù)據(jù)表執(zhí)行所述獲取裝置11’及塊遍歷裝置12’。在此,依此對(duì)所述數(shù)據(jù)庫(kù)中的各個(gè)待遍歷的數(shù)據(jù)表執(zhí)行所述獲取裝置11’及塊遍歷裝置12’,直至遍歷完所述數(shù)據(jù)庫(kù)中的全部待遍歷的數(shù)據(jù)表,結(jié)束對(duì)所述數(shù)據(jù)庫(kù)的遍歷。此外,本申請(qǐng)實(shí)施例還提供了另一種數(shù)據(jù)庫(kù)遍歷設(shè)備,所述設(shè)備的結(jié)構(gòu)如圖9所示,包括處理器910,以及被安排成存儲(chǔ)計(jì)算機(jī)可執(zhí)行指令的存儲(chǔ)器920。所述可執(zhí)行指令在被執(zhí)行時(shí)使所述處理器:獲取數(shù)據(jù)庫(kù)中待遍歷的數(shù)據(jù)表所對(duì)應(yīng)的目標(biāo)索引;以及基于所述目標(biāo)索引對(duì)所述數(shù)據(jù)表中的各數(shù)據(jù)塊執(zhí)行塊遍歷操作,并在遍歷所述數(shù)據(jù)表的過程中,根據(jù)所述數(shù)據(jù)表中當(dāng)前數(shù)據(jù)塊被塊遍歷后的sql執(zhí)行時(shí)間信息確定所述數(shù)據(jù)表中下一數(shù)據(jù)塊的塊尺寸信息。以mysql數(shù)據(jù)庫(kù)為例,采用上述方案對(duì)該mysql數(shù)據(jù)庫(kù)進(jìn)行遍歷的處理過程如圖5所示。該mysql數(shù)據(jù)庫(kù)包含多張數(shù)據(jù)表,在對(duì)數(shù)據(jù)庫(kù)進(jìn)行遍歷的過程中,需要完成對(duì)所有數(shù)據(jù)表的遍歷,具體處理過程如下:步驟s501,對(duì)于一張數(shù)據(jù)表,選出遍歷時(shí)iops消耗小的索引。在進(jìn)行遍歷的過程中,若按照所述該索引進(jìn)行,將使得iops小,消耗的磁盤資源也少。該索引即為所述的目標(biāo)索引。在實(shí)際場(chǎng)景中,選取目標(biāo)索引的過程如圖6所示,若mysql數(shù)據(jù)庫(kù)中的某一數(shù)據(jù)已經(jīng)存在了至少一種所有字段非空的唯一索引,則可以選擇其中一種,直接作為目標(biāo)索引來使用,例如mysql數(shù)據(jù)庫(kù)的innodb引擎中的聚集索引;若不存在,則為所述數(shù)據(jù)表建立唯一索引(即隱式索引),以作為所述目標(biāo)索引。步驟s502,在該數(shù)據(jù)表中找到按索引排序的第一個(gè)數(shù)據(jù)塊的上下界,然后按照上下界所確定的范圍遍歷這一數(shù)據(jù)塊;并且,在遍歷過程中,按照遍歷耗時(shí)、所屬數(shù)據(jù)表的特性等對(duì)數(shù)據(jù)塊的遍歷過程進(jìn)行控制。實(shí)際場(chǎng)景中,對(duì)于數(shù)據(jù)表也需要將其分為多個(gè)數(shù)據(jù)塊進(jìn)行遍歷,圖7示出了對(duì)數(shù)據(jù)塊實(shí)現(xiàn)遍歷的方式。例如,對(duì)于如下結(jié)構(gòu)的數(shù)據(jù)表:createtable`wp_term_relationships`(`object_id`bigint(20)unsignednotnulldefault'0',`term_taxonomy_id`bigint(20)unsignednotnulldefault'0',`term_order`int(11)notnulldefault'0',primarykey(`object_id`,`term_taxonomy_id`),key`term_taxonomy_id`(`term_taxonomy_id`))engine=innodbdefaultcharset=utf8對(duì)其中各個(gè)數(shù)據(jù)塊的遍歷過程可以在該數(shù)據(jù)表中,由字段`object_id`和`term_taxonomy_id`組成的索引即為目標(biāo)索引。開始遍歷時(shí),首先,通過sql語(yǔ)句:select`object_id`,`term_taxonomy_id`from`wp_term_relationships`limit1;可以找到該數(shù)據(jù)表的第一行記錄作為第一個(gè)數(shù)據(jù)塊的下界。然后,確定這個(gè)數(shù)據(jù)塊的大小,即這一數(shù)據(jù)塊的尺寸信息。例如在遍歷初始化時(shí)設(shè)定第一個(gè)數(shù)據(jù)塊有n行記錄,則可以確定該數(shù)據(jù)塊的大小為n行。由此,基于這個(gè)數(shù)據(jù)塊的下界和大小可以找到當(dāng)前數(shù)據(jù)塊的上界和一下數(shù)據(jù)塊的下界。假設(shè)通過上述sql語(yǔ)句找到的下界為(1,2),那么找上界也就是要找(`object_id`,`term_taxonomy_id`)>=(1,2)的前n行記錄中的最大值,在mysql數(shù)據(jù)庫(kù)中,可以通過如下的sql語(yǔ)句來實(shí)現(xiàn):where`object_id`>1or(where`object_id`=1and`term_taxonomy_id`>=2)limitn-1,2;其中,將大于等于下界(1,2)分成了兩種情況:一種是第一個(gè)字段`object_id`比1大;另一種是第一個(gè)字段`object_id`等于1,但是第二個(gè)字段`term_taxonomy_id`>=2。類似的,假定上界是(500,1000),小于等于上界也可以分成兩種情況:一種是第一個(gè)字段`object_id`比500?。涣硪环N是第一個(gè)字段`object_id`等于500,但是第二個(gè)字段`term_taxonomy_id`<=1000。其中,“l(fā)imitn-1,2”指的是找到比下界大的第n行記錄和第n+1行記錄,這兩行記錄分別對(duì)應(yīng)當(dāng)前數(shù)據(jù)塊的上界和下一數(shù)據(jù)塊的下界。在確定所述塊范圍信息(即數(shù)據(jù)塊的上下界)后,可以通過如下的sql語(yǔ)句來進(jìn)行遍歷:where(`object_id`>1or(where`object_id`=1and`term_taxonomy_id`>=2))and(`object_id`<500or(where`object_id`=500and`term_taxonomy_id`<=1000))在完成一個(gè)數(shù)據(jù)塊的遍歷之后,可以根據(jù)下一數(shù)據(jù)塊的下界和下一數(shù)據(jù)塊包含的記錄行數(shù)m,對(duì)下一數(shù)據(jù)塊執(zhí)行所述塊遍歷操作。并依此對(duì)所述數(shù)據(jù)表中的各數(shù)據(jù)塊執(zhí)行所述塊遍歷操作,直至遍歷完所述數(shù)據(jù)表中的全部數(shù)據(jù)塊。在對(duì)所有數(shù)據(jù)塊的遍歷過程中,若找不到下一數(shù)據(jù)塊的下界,則表示當(dāng)前數(shù)據(jù)塊即為所述數(shù)據(jù)表中的最后一個(gè)數(shù)據(jù)塊,從而結(jié)束對(duì)一張數(shù)據(jù)表的遍歷。在實(shí)際場(chǎng)景中,在完成某一數(shù)據(jù)塊的遍歷之后,如不是數(shù)據(jù)表中的最后一個(gè)數(shù)據(jù)塊,還可以進(jìn)一步判定是否遍歷過程是否進(jìn)入了死循環(huán),若未進(jìn)入死循環(huán)則繼續(xù)一下數(shù)據(jù)塊的處理,若進(jìn)入到了死循環(huán),則可以結(jié)束對(duì)所述數(shù)據(jù)表的遍歷,避免無效的處理開銷。步驟s503,在當(dāng)前數(shù)據(jù)表遍歷完成之后,進(jìn)行下一張數(shù)據(jù)表的遍歷。在實(shí)際場(chǎng)景中,若遍歷當(dāng)前數(shù)據(jù)表時(shí)由于無合適索引等因素,可能會(huì)引起回表;如果找到合適的索引,則遍歷時(shí)無回表或者極少回表。對(duì)于mysql數(shù)據(jù)庫(kù)而言,若所述目標(biāo)索引為單字段索引,通常在遍歷時(shí)無回表或極少回表,則根據(jù)所述塊尺寸信息確定所述當(dāng)前數(shù)據(jù)塊被塊遍歷后的緩沖信息;若所述目標(biāo)索引為多字段索引,通常在遍歷時(shí)并不能將多個(gè)字段都用到數(shù)據(jù)定位上,可能造成較多回表,則可以借助cgroups來控制iops,并確定所述當(dāng)前數(shù)據(jù)塊被塊遍歷后的緩沖信息,具體如圖8所示。與現(xiàn)有技術(shù)相比,本申請(qǐng)先獲取數(shù)據(jù)庫(kù)中待遍歷的數(shù)據(jù)表所對(duì)應(yīng)的目標(biāo)索引,其中,通過所述目標(biāo)索引進(jìn)行遍歷時(shí)的iops最?。蝗缓?,基于所述目標(biāo)索引對(duì)所述數(shù)據(jù)表中的各數(shù)據(jù)塊執(zhí)行塊遍歷操作,并在遍歷所述數(shù)據(jù)表的過程中,通過確定所述數(shù)據(jù)表中下一數(shù)據(jù)塊的塊尺寸信息來達(dá)到精確控制iops的目的,提升用戶體驗(yàn)。進(jìn)一步地,本申請(qǐng)?jiān)诋?dāng)前數(shù)據(jù)塊為所述數(shù)據(jù)表中的最后一塊時(shí),結(jié)束所述數(shù)據(jù)表的遍歷操作,從而避免遍歷進(jìn)入死循環(huán),提升安全性。進(jìn)一步地,本申請(qǐng)?jiān)诟鶕?jù)所述期望塊時(shí)間確定所述下一數(shù)據(jù)塊的塊尺寸信息中,當(dāng)增加所述下一數(shù)據(jù)塊的塊尺寸信息時(shí)采用緩慢增長(zhǎng),當(dāng)需要減少所述下一數(shù)據(jù)塊的塊尺寸信息時(shí)采用快速減小,來實(shí)現(xiàn)對(duì)iops更加精確的控制。需要注意的是,本申請(qǐng)可在軟件和/或軟件與硬件的組合體中被實(shí)施,例如,可采用專用集成電路(asic)、通用目的計(jì)算機(jī)或任何其他類似硬件設(shè)備來實(shí)現(xiàn)。在一個(gè)實(shí)施例中,本申請(qǐng)的軟件程序可以通過處理器執(zhí)行以實(shí)現(xiàn)上文所述步驟或功能。同樣地,本申請(qǐng)的軟件程序(包括相關(guān)的數(shù)據(jù)結(jié)構(gòu))可以被存儲(chǔ)到計(jì)算機(jī)可讀記錄介質(zhì)中,例如,ram存儲(chǔ)器,磁或光驅(qū)動(dòng)器或軟磁盤及類似設(shè)備。另外,本申請(qǐng)的一些步驟或功能可采用硬件來實(shí)現(xiàn),例如,作為與處理器配合從而執(zhí)行各個(gè)步驟或功能的電路。另外,本申請(qǐng)的一部分可被應(yīng)用為計(jì)算機(jī)程序產(chǎn)品,例如計(jì)算機(jī)程序指令,當(dāng)其被計(jì)算機(jī)執(zhí)行時(shí),通過該計(jì)算機(jī)的操作,可以調(diào)用或提供根據(jù)本申請(qǐng)的方法和/或技術(shù)方案。而調(diào)用本申請(qǐng)的方法的程序指令,可能被存儲(chǔ)在固定的或可移動(dòng)的記錄介質(zhì)中,和/或通過廣播或其他信號(hào)承載媒體中的數(shù)據(jù)流而被傳輸,和/或被存儲(chǔ)在根據(jù)所述程序指令運(yùn)行的計(jì)算機(jī)設(shè)備的工作存儲(chǔ)器中。在此,根據(jù)本申請(qǐng)的一個(gè)實(shí)施例包括一個(gè)裝置,該裝置包括用于存儲(chǔ)計(jì)算機(jī)程序指令的存儲(chǔ)器和用于執(zhí)行程序指令的處理器,其中,當(dāng)該計(jì)算機(jī)程序指令被該處理器執(zhí)行時(shí),觸發(fā)該裝置運(yùn)行基于前述根據(jù)本申請(qǐng)的多個(gè)實(shí)施例的方法和/或技術(shù)方案。對(duì)于本領(lǐng)域技術(shù)人員而言,顯然本申請(qǐng)不限于上述示范性實(shí)施例的細(xì)節(jié),而且在不背離本申請(qǐng)的精神或基本特征的情況下,能夠以其他的具體形式實(shí)現(xiàn)本申請(qǐng)。因此,無論從哪一點(diǎn)來看,均應(yīng)將實(shí)施例看作是示范性的,而且是非限制性的,本申請(qǐng)的范圍由所附權(quán)利要求而不是上述說明限定,因此旨在將落在權(quán)利要求的等同要件的含義和范圍內(nèi)的所有變化涵括在本申請(qǐng)內(nèi)。不應(yīng)將權(quán)利要求中的任何附圖標(biāo)記視為限制所涉及的權(quán)利要求。此外,顯然“包括”一詞不排除其他單元或步驟,單數(shù)不排除復(fù)數(shù)。裝置權(quán)利要求中陳述的多個(gè)單元或裝置也可以由一個(gè)單元或裝置通過軟件或者硬件來實(shí)現(xiàn)。第一,第二等詞語(yǔ)用來表示名稱,而并不表示任何特定的順序。當(dāng)前第1頁(yè)12當(dāng)前第1頁(yè)12