本申請(qǐng)涉及數(shù)據(jù)處理
技術(shù)領(lǐng)域:
:,尤其涉及一種數(shù)據(jù)庫(kù)表索引的實(shí)現(xiàn)方法和裝置。
背景技術(shù):
::隨著技術(shù)的發(fā)展,各種網(wǎng)絡(luò)應(yīng)用日漸深入人們的生活。這些應(yīng)用的業(yè)務(wù)系統(tǒng)需要使用和管理日益增加的各種業(yè)務(wù)數(shù)據(jù),來(lái)完成其業(yè)務(wù)過(guò)程。業(yè)務(wù)數(shù)據(jù)通常以表的結(jié)構(gòu)存放在數(shù)據(jù)庫(kù)中,為了加快對(duì)表中數(shù)據(jù)的訪問(wèn)速度,可以在數(shù)據(jù)庫(kù)表中建立索引。索引是對(duì)數(shù)據(jù)庫(kù)表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu),采用索引查找表中的記錄(行)能夠基于特定的算法來(lái)進(jìn)行,而不必進(jìn)行全表掃描,有助于更快的獲取信息。唯一性索引還可以用來(lái)確保索引列不包含重復(fù)的值,例如多列唯一性索引可以確保索引列中每個(gè)值組合都是唯一的。一些中小型的數(shù)據(jù)庫(kù)對(duì)索引的長(zhǎng)度做出了限制,例如,MySQL(一種關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng))數(shù)據(jù)庫(kù)中,采用MyISAM存儲(chǔ)引擎的表的最大索引長(zhǎng)度是1000字節(jié),采用InnoDB存儲(chǔ)引擎的表的最大索引長(zhǎng)度是3072字節(jié)。而很多業(yè)務(wù)系統(tǒng)的數(shù)據(jù)庫(kù)表中包括長(zhǎng)度超過(guò)最大索引長(zhǎng)度的列,例如用來(lái)保存KV(Key-Value,鍵-值)結(jié)構(gòu)或JSON(JavaScriptObjectNotation,JavaScript對(duì)象表示法)序列化字符串的列。現(xiàn)有技術(shù)中,對(duì)具有索引長(zhǎng)度限制的數(shù)據(jù)庫(kù)表,只能對(duì)長(zhǎng)度不超過(guò)最大索引長(zhǎng)度的列建立索引。當(dāng)用來(lái)建立索引的列可能超過(guò)最大索引長(zhǎng)度時(shí),只能對(duì)該列的值進(jìn)行限制,這樣會(huì)造成業(yè)務(wù)信息的損失,在一些情況下甚至難以滿足業(yè)務(wù)上的要求;如果不損失業(yè)務(wù)信息,就只能接受查詢速度下降,業(yè)務(wù)響應(yīng)遲滯的結(jié)果;對(duì)需要以超過(guò)最大索引長(zhǎng)度的列來(lái)建立唯一性索引的應(yīng)用場(chǎng)景,無(wú)法建立索引造成多條相同的記錄保存在數(shù)據(jù)庫(kù)表中。技術(shù)實(shí)現(xiàn)要素:有鑒于此,本申請(qǐng)?zhí)峁┮环N數(shù)據(jù)庫(kù)表索引的實(shí)現(xiàn)方法,所述數(shù)據(jù)庫(kù)表包括至少一個(gè)用來(lái)建立索引的摘要列,每個(gè)摘要列對(duì)應(yīng)于一個(gè)所述數(shù)據(jù)庫(kù)表中的引用列,所述方法包括:獲取所述數(shù)據(jù)庫(kù)表中摘要列和引用列的對(duì)應(yīng)關(guān)系;當(dāng)在所述數(shù)據(jù)庫(kù)表中新增記錄時(shí),在所述記錄中與引用列對(duì)應(yīng)的摘要列保存所述引用列值的摘要值;當(dāng)對(duì)所述數(shù)據(jù)庫(kù)表的操作以引用列及其列值為條件時(shí),將條件中的引用列替換為對(duì)應(yīng)的摘要列,將條件中的引用列值替換為所述引用列值的摘要值后,進(jìn)行所述操作。本申請(qǐng)還提供了一種數(shù)據(jù)庫(kù)表索引的實(shí)現(xiàn)裝置,所述數(shù)據(jù)庫(kù)表包括至少一個(gè)用來(lái)建立索引的摘要列,每個(gè)摘要列對(duì)應(yīng)于一個(gè)所述數(shù)據(jù)庫(kù)表中的引用列,所述裝置包括:對(duì)應(yīng)關(guān)系獲取單元,用于獲取所述數(shù)據(jù)庫(kù)表中摘要列和引用列的對(duì)應(yīng)關(guān)系;新增記錄處理單元,用于當(dāng)在所述數(shù)據(jù)庫(kù)表中新增記錄時(shí),在所述記錄中與引用列對(duì)應(yīng)的摘要列保存所述引用列值的摘要值;條件操作處理單元,用于當(dāng)對(duì)所述數(shù)據(jù)庫(kù)表的操作以引用列及其列值為條件時(shí),將條件中的引用列替換為對(duì)應(yīng)的摘要列,將條件中的引用列值替換為所述引用列值的摘要值后,進(jìn)行所述操作。由以上技術(shù)方案可見(jiàn),本申請(qǐng)的實(shí)施例中,在數(shù)據(jù)庫(kù)表中增加對(duì)應(yīng)于引用列的摘要列,用來(lái)保存引用列值的摘要值,采用摘要列來(lái)生成索引,并在對(duì)數(shù)據(jù)庫(kù)表進(jìn)行以引用列及其列值為條件的操作時(shí),將其替換為以對(duì)應(yīng)的摘要列及其列值為條件,這樣即使引用列的長(zhǎng)度超過(guò)最大索引長(zhǎng)度,也能夠建立索引來(lái)加快數(shù)據(jù)操作速度和業(yè)務(wù)響應(yīng)速度,并且不會(huì)因限制列長(zhǎng)度損失業(yè)務(wù)數(shù)據(jù)的完整性,在建立的索引為唯一性索引時(shí)還能夠避免數(shù)據(jù)庫(kù)表中出現(xiàn)重復(fù)的記錄。附圖說(shuō)明圖1是業(yè)務(wù)系統(tǒng)訪問(wèn)數(shù)據(jù)庫(kù)的第一種方式的網(wǎng)絡(luò)結(jié)構(gòu)示意圖;圖2是業(yè)務(wù)系統(tǒng)訪問(wèn)數(shù)據(jù)庫(kù)的第二種方式的網(wǎng)絡(luò)結(jié)構(gòu)示意圖;圖3是本申請(qǐng)實(shí)施例中一種數(shù)據(jù)庫(kù)表索引的實(shí)現(xiàn)方法的流程圖;圖4是運(yùn)行本申請(qǐng)實(shí)施例的設(shè)備的一種硬件結(jié)構(gòu)圖;圖5是本申請(qǐng)實(shí)施例中一種數(shù)據(jù)庫(kù)表索引的實(shí)現(xiàn)裝置的邏輯結(jié)構(gòu)圖。具體實(shí)施方式本申請(qǐng)的實(shí)施例提出一種新的數(shù)據(jù)庫(kù)表索引的實(shí)現(xiàn)方法,對(duì)列長(zhǎng)度可能超過(guò)最大索引長(zhǎng)度的引用列,在數(shù)據(jù)庫(kù)表中增加對(duì)應(yīng)的摘要列,以引用列值的摘要值作為摘要列的值,采用摘要列而非引用列即可建立滿足長(zhǎng)度限制條件的索引,不僅能夠通過(guò)該索引提升對(duì)表數(shù)據(jù)的操作速度,而且無(wú)需縮減引用列中的業(yè)務(wù)數(shù)據(jù),從而解決現(xiàn)有技術(shù)中的問(wèn)題。業(yè)務(wù)系統(tǒng)通常通過(guò)兩種方式來(lái)對(duì)數(shù)據(jù)庫(kù)進(jìn)行訪問(wèn),第一種方式如圖1所示,業(yè)務(wù)系統(tǒng)通過(guò)數(shù)據(jù)庫(kù)中間件來(lái)對(duì)數(shù)據(jù)庫(kù)表進(jìn)行操作,添加、刪除、更新、查詢其中的業(yè)務(wù)數(shù)據(jù);第二種方式如圖2所示,業(yè)務(wù)系統(tǒng)直接訪問(wèn)數(shù)據(jù)庫(kù),在這種方式中,通常業(yè)務(wù)系統(tǒng)的實(shí)現(xiàn)包括業(yè)務(wù)邏輯層和數(shù)據(jù)訪問(wèn)層,其中業(yè)務(wù)邏輯層用來(lái)實(shí)現(xiàn)業(yè)務(wù)過(guò)程,并通過(guò)數(shù)據(jù)訪問(wèn)層來(lái)操作數(shù)據(jù)庫(kù)表。在第一種方式中,本申請(qǐng)的實(shí)施例應(yīng)用在數(shù)據(jù)庫(kù)中間件上,業(yè)務(wù)系統(tǒng)無(wú)需更改現(xiàn)有的對(duì)數(shù)據(jù)庫(kù)表的操作;在第二種方式中,本申請(qǐng)的實(shí)施例應(yīng)用在數(shù)據(jù)訪問(wèn)層,類似的,業(yè)務(wù)邏輯層無(wú)需修改現(xiàn)有實(shí)現(xiàn)即可完成對(duì)數(shù)據(jù)庫(kù)表的操作。根據(jù)實(shí)際應(yīng)用中業(yè)務(wù)系統(tǒng)和數(shù)據(jù)庫(kù)的具體實(shí)現(xiàn),本申請(qǐng)的實(shí)施例也可以應(yīng)用在其他具有數(shù)據(jù)庫(kù)訪問(wèn)控制功能的邏輯單位、服務(wù)或系統(tǒng)中,不做限定。以下將應(yīng)用本申請(qǐng)實(shí)施例的邏輯單位、服務(wù)或系統(tǒng)統(tǒng)稱為訪問(wèn)控制功能模塊,將通過(guò)訪問(wèn)控制功能模塊進(jìn)行數(shù)據(jù)庫(kù)表操作的邏輯單位、服務(wù)或系統(tǒng)統(tǒng)稱為業(yè)務(wù)功能模塊。本申請(qǐng)的實(shí)施例可以運(yùn)行在任何具有計(jì)算和存儲(chǔ)能力的設(shè)備上,例如可以是手機(jī)、平板電腦、PC(PersonalComputer,個(gè)人電腦)、筆記本、服務(wù)器、虛擬機(jī)等物理設(shè)備或邏輯設(shè)備;也可以由兩個(gè)或兩個(gè)以上分擔(dān)不同職責(zé)的物理或邏輯設(shè)備、相互協(xié)同來(lái)實(shí)現(xiàn)本申請(qǐng)實(shí)施例中的各項(xiàng)功能。本申請(qǐng)的實(shí)施例中,將數(shù)據(jù)庫(kù)表中列長(zhǎng)度可能超過(guò)索引最大長(zhǎng)度、并且在業(yè)務(wù)過(guò)程中需要根據(jù)列值查詢數(shù)據(jù)庫(kù)表記錄的列作為引用列,還可以根據(jù)實(shí)際場(chǎng)景的具體情況將數(shù)據(jù)庫(kù)表中其他會(huì)用來(lái)查詢記錄的列作為引用列。一個(gè)數(shù)據(jù)庫(kù)表中可以有一個(gè)到多個(gè)引用列。在確定引用列后,在數(shù)據(jù)庫(kù)表中為每個(gè)引用列增加一個(gè)對(duì)應(yīng)的摘要列,摘要列用來(lái)存儲(chǔ)對(duì)應(yīng)的引用列的摘要值,即:每個(gè)數(shù)據(jù)庫(kù)表記錄的摘要列值為該記錄對(duì)應(yīng)的引用列值的摘要值,其中,摘要值是將引用列值輸入預(yù)定的摘要算法后得到的結(jié)果。本申請(qǐng)實(shí)施例對(duì)摘要算法的選擇不做限定,例如,各種版本的CRC(CyclicRedundancyCheck,循環(huán)冗余校驗(yàn))、MD(Message-DigestAlgorithm,消息摘要算法)、SHA(SecureHashAlgorithm,安全哈希算法)等。當(dāng)有超過(guò)一個(gè)的摘要列用來(lái)生成多列索引、或某個(gè)摘要列與其他列用來(lái)生成多列索引時(shí),要選擇使用于生成某個(gè)索引的所有摘要列和其他列的列長(zhǎng)度總和小于所在數(shù)據(jù)庫(kù)表最大索引長(zhǎng)度的摘要算法。摘要算法用來(lái)根據(jù)一定的運(yùn)算規(guī)則對(duì)輸入數(shù)據(jù)進(jìn)行某種形式的提取,提出的內(nèi)容即為摘要數(shù)據(jù),摘要數(shù)據(jù)與輸入數(shù)據(jù)有密切聯(lián)系,只要輸入數(shù)據(jù)稍有改變,摘要數(shù)據(jù)便完全不同。這樣,以引用列值查詢數(shù)據(jù)庫(kù)表,和以引用列值的摘要值查詢數(shù)據(jù)庫(kù)表,在數(shù)據(jù)庫(kù)表的容量范圍內(nèi)基本可以得到完全相同的查詢結(jié)果,因此,可以用摘要列替代對(duì)應(yīng)的引用列來(lái)建立索引,以引用列值的摘要值來(lái)使用索引,從而避免因列長(zhǎng)度超過(guò)索引長(zhǎng)度限制而導(dǎo)致數(shù)據(jù)庫(kù)訪問(wèn)速度下降。需要說(shuō)明的是,在數(shù)據(jù)庫(kù)表中增加的摘要列可以對(duì)業(yè)務(wù)功能模塊不可見(jiàn),換言之,業(yè)務(wù)功能模塊只要按照現(xiàn)有的方式進(jìn)行數(shù)據(jù)庫(kù)表中業(yè)務(wù)數(shù)據(jù)的操作即可,而無(wú)需了解數(shù)據(jù)庫(kù)表中是否有摘要列、以及是否需要使用由摘要列建立的索引。訪問(wèn)控制功能模塊可以參照現(xiàn)有技術(shù)來(lái)在數(shù)據(jù)庫(kù)表中添加摘要列,并給基于包括摘要列在內(nèi)的一個(gè)到多個(gè)列建立索引(也可以由人工完成),本申請(qǐng)的實(shí)施例不做限定。各種數(shù)據(jù)庫(kù)都會(huì)保存并在運(yùn)行時(shí)加載元數(shù)據(jù),按照元數(shù)據(jù)生成數(shù)據(jù)庫(kù)中的各種對(duì)象(如數(shù)據(jù)庫(kù)本身、表、視圖等)。元數(shù)據(jù)是用來(lái)描述數(shù)據(jù)的數(shù)據(jù),包括數(shù)據(jù)庫(kù)中的各種對(duì)象的定義信息,其中數(shù)據(jù)庫(kù)表的元數(shù)據(jù)可以包括表中各個(gè)列的列名、列長(zhǎng)度、列類型、以及對(duì)全部索引的定義等;同時(shí)數(shù)據(jù)庫(kù)也提供了創(chuàng)建、修改或刪除元數(shù)據(jù)的工具,例如,可以采用通用于多種數(shù)據(jù)庫(kù)的DDL(DataDefinitionLanguage數(shù)據(jù)定義語(yǔ)言)語(yǔ)句來(lái)為數(shù)據(jù)庫(kù)表添加列、添加列注釋、添加索引等等??梢?jiàn),訪問(wèn)控制功能模塊利用修改工具改變數(shù)據(jù)庫(kù)表的元數(shù)據(jù),即可在該數(shù)據(jù)庫(kù)表中添加摘要列、建立新的索引。本申請(qǐng)的實(shí)施例中,數(shù)據(jù)庫(kù)表索引的實(shí)現(xiàn)方法的流程如圖3所示。數(shù)據(jù)庫(kù)表包括至少一個(gè)用來(lái)建立索引的摘要列,每個(gè)摘要列對(duì)應(yīng)于一個(gè)數(shù)據(jù)庫(kù)表中的引用列步驟310,獲取所述數(shù)據(jù)庫(kù)表中摘要列和引用列的對(duì)應(yīng)關(guān)系。訪問(wèn)控制功能模塊在某個(gè)數(shù)據(jù)庫(kù)表的元數(shù)據(jù)中添加摘要列和以摘要列生成的索引后,數(shù)據(jù)庫(kù)根據(jù)新的元數(shù)據(jù)加載該數(shù)據(jù)庫(kù)表,加載后該數(shù)據(jù)庫(kù)表中即包括摘要列和以摘要列生成的索引。在對(duì)該數(shù)據(jù)庫(kù)表的記錄執(zhí)行具體操作前,訪問(wèn)控制功能模塊需要知道摘要列對(duì)應(yīng)于哪個(gè)引用列,以便確定記錄中摘要列的值和根據(jù)摘要列值使用索引。例如,可以在訪問(wèn)控制功能模塊的代碼中直接寫入某個(gè)數(shù)據(jù)庫(kù)表中的每個(gè)摘要列以及與該摘要列對(duì)應(yīng)的引用列,這樣訪問(wèn)控制功能模塊在運(yùn)行過(guò)程即可得到該對(duì)應(yīng)關(guān)系;再如,可以將某個(gè)數(shù)據(jù)庫(kù)表中的每個(gè)摘要列與引用列的對(duì)應(yīng)關(guān)系寫入預(yù)定的配置文件中,訪問(wèn)控制功能模塊讀取該配置文件即可獲得這一對(duì)應(yīng)關(guān)系。在一種實(shí)施方式中,可以在數(shù)據(jù)庫(kù)表的元數(shù)據(jù)中以預(yù)定方式表明哪個(gè)列是摘要列或哪個(gè)列是引用列、以及摘要列與引用列的對(duì)應(yīng)關(guān)系,這樣按照與該預(yù)定方式相匹配的摘要列發(fā)現(xiàn)規(guī)則,訪問(wèn)控制功能模塊可以在數(shù)據(jù)庫(kù)表的元數(shù)據(jù)中發(fā)現(xiàn)摘要列與引用列的對(duì)應(yīng)關(guān)系。以下舉例說(shuō)明:第一個(gè)例子中,在對(duì)摘要列命名時(shí),在列名中帶有預(yù)定摘要列標(biāo)志和其對(duì)應(yīng)的引用列列名。預(yù)定摘要列標(biāo)志用來(lái)表示本列為摘要列,可以采用不會(huì)在該數(shù)據(jù)庫(kù)表的其他列名中完整出現(xiàn)的字符串作為預(yù)定摘要列標(biāo)志,例如'*-digest-*',還可以規(guī)定該預(yù)定摘要列標(biāo)志在列名中的位置,如開(kāi)頭或結(jié)尾。與本摘要列對(duì)應(yīng)的引用列的列名也可以以預(yù)定的位置或預(yù)定的格式出現(xiàn)。這樣,如果元數(shù)據(jù)中數(shù)據(jù)庫(kù)表的列名帶有預(yù)定摘要列標(biāo)志字符串,并且該列名被數(shù)據(jù)庫(kù)表的索引引用(即采用該列來(lái)建立索引),訪問(wèn)控制功能模塊即可知道,該列是摘要列,并且從其列名中的預(yù)定位置找到對(duì)應(yīng)的引用列列名、或查找出在列名中以預(yù)定格式出現(xiàn)的引用列列名。第二個(gè)例子中,在元數(shù)據(jù)的摘要列注釋中,寫入預(yù)定摘要列標(biāo)志和其對(duì)應(yīng)的引用列的列名。預(yù)定摘要列標(biāo)志用來(lái)表明本列是摘要列,可以采用不會(huì)出現(xiàn)在本數(shù)據(jù)庫(kù)表的其他列注釋中的預(yù)定字符串來(lái)作為預(yù)定摘要列標(biāo)志,例如'*-digest-*'、或'Thiscolisadigestcol.'等。類似的,所對(duì)應(yīng)的引用列的列名也可以采用能夠辨識(shí)的約定格式寫入到摘要列注釋中,如'-*OriginalColName*-'、或'AbstractedfromOriginalColName.'等。這樣,訪問(wèn)控制功能模塊如果從元數(shù)據(jù)的某個(gè)列注釋中發(fā)現(xiàn)了預(yù)定摘要列標(biāo)志,并且該列被數(shù)據(jù)庫(kù)表的索引引用,則可以確定該列是摘要列,并且從該列注釋中可以得到該摘要列對(duì)應(yīng)的引用列。第三個(gè)例子中,在元數(shù)據(jù)的引用列注釋中,寫入預(yù)定引用列標(biāo)志和其對(duì)應(yīng)的摘要列的列名。預(yù)定引用列標(biāo)志用來(lái)表明本列是引用列,可以采用不會(huì)出現(xiàn)在本數(shù)據(jù)庫(kù)表的其他列注釋中的預(yù)定字符串來(lái)作為預(yù)定引用列標(biāo)志,例如'*-Original-*'、或'Thiscolisaoriginalcol.'等。類似的,所對(duì)應(yīng)的摘要列的列名也可以采用能夠辨識(shí)的約定格式寫入到引用列注釋中,如'-*DigestColName*-'、或'AbstractingtoDigestColName.'等。這樣,訪問(wèn)控制功能模塊如果從元數(shù)據(jù)的某個(gè)列注釋中發(fā)現(xiàn)了預(yù)定引用列標(biāo)志,并且該列注釋中的摘要列被數(shù)據(jù)庫(kù)表的索引引用,則可以確定該列是引用列,并且該列注釋中的摘要列即為該引用列對(duì)應(yīng)的摘要列。訪問(wèn)控制功能模塊可以在每次對(duì)數(shù)據(jù)庫(kù)表中進(jìn)行操作時(shí)獲取摘要列和引用列的對(duì)應(yīng)關(guān)系;也可以在訪問(wèn)控制功能模塊啟動(dòng)時(shí)獲取該對(duì)應(yīng)關(guān)系并緩存,用于后續(xù)對(duì)該數(shù)據(jù)庫(kù)表的操作;還可以在首次對(duì)該數(shù)據(jù)庫(kù)表進(jìn)行操作時(shí)獲取給對(duì)應(yīng)關(guān)系并緩存。步驟320,當(dāng)在該數(shù)據(jù)庫(kù)表中新增記錄時(shí),在該記錄中與引用列對(duì)應(yīng)的摘要列保存該引用列值的摘要值。業(yè)務(wù)功能模塊要在該數(shù)據(jù)庫(kù)表中增加一條記錄時(shí),采用插入記錄指令,以新增記錄中若干個(gè)列及其列值為參數(shù),調(diào)用訪問(wèn)控制功能模塊。由于在該數(shù)據(jù)庫(kù)表中增加的摘要列通常對(duì)業(yè)務(wù)功能模塊不可見(jiàn),因此在插入記錄指令的參數(shù)中往往不包括摘要列及其列值。訪問(wèn)控制功能模塊在該數(shù)據(jù)庫(kù)表中添加記錄時(shí),不僅將插入記錄指令中各個(gè)列的列值分別寫入新增記錄對(duì)應(yīng)的列中,而且為每個(gè)引用列按照預(yù)定的摘要算法計(jì)算其列值的摘要值,寫入到與該引用列對(duì)應(yīng)的摘要列中。具體而言,訪問(wèn)控制功能模塊可以采用兩種方式來(lái)執(zhí)行插入記錄指令。第一種方式是,在收到業(yè)務(wù)功能模塊的插入記錄指令后,先修改插入記錄指令,在插入記錄指令中增加摘要列及其列值,摘要列值為摘要列對(duì)應(yīng)的引用列值的摘要值;然后執(zhí)行修改后的插入記錄指令,將新增記錄中包括摘要列值在內(nèi)的各個(gè)列值寫入到對(duì)應(yīng)的列中。第二種方式是,在收到業(yè)務(wù)功能模塊的插入記錄指令后,先執(zhí)行該插入記錄指令,將參數(shù)中包括的列值寫入到新增記錄對(duì)應(yīng)的列中;再生成并執(zhí)行對(duì)新增記錄的更新指令,在更新指令中將新增記錄的摘要列值更新為與該摘要列對(duì)應(yīng)的引用列值的摘要值。當(dāng)業(yè)務(wù)功能模塊修改數(shù)據(jù)庫(kù)表指定記錄中的引用列值時(shí),采用針對(duì)指定記錄的更新指令,以引用列及其新引用列值為參數(shù),調(diào)用訪問(wèn)控制功能模塊。在引用列值變化時(shí),其對(duì)應(yīng)的摘要列值應(yīng)該隨之變化,但是更新指令的參數(shù)中通常不包括對(duì)應(yīng)的摘要列及其新摘要列值。訪問(wèn)控制功能模塊在修改指定記錄的引用列值時(shí),不僅將指定記錄的引用列值更新為新引用列值,并且將該記錄中與要修改的引用列對(duì)應(yīng)的摘要列值更新為新引用列值的摘要值。具體而言,訪問(wèn)控制功能模塊可以采用兩種方式來(lái)執(zhí)行對(duì)指定記錄中引用列值的更新指令。第一種方式是,在收到業(yè)務(wù)功能模塊的更新指令后,先修改更新指令,在更新指令中增加與要修改的引用列對(duì)應(yīng)的摘要列及其新摘要列值,新摘要列值為新引用列值的摘要值;然后執(zhí)行修改后的更新指令,將指定記錄中的引用列和對(duì)應(yīng)的摘要列的列值分別修改為新引用列值和新摘要列值。第二種方式是,在收到業(yè)務(wù)功能模塊對(duì)指定記錄的更新指令后,先執(zhí)行該更新指令,將指定記錄的引用列修改為更新指令參數(shù)中的新引用列值;再生成并執(zhí)行對(duì)指定記錄的另一條更新指令,這條更新指令用來(lái)將指定記錄中與被修改列值的引用列對(duì)應(yīng)的摘要列值更新為新引用列值的摘要值。需要說(shuō)明的是,當(dāng)數(shù)據(jù)庫(kù)表中新增記錄后,數(shù)據(jù)庫(kù)將自動(dòng)按照新增記錄中的摘要列值更新采用摘要列生成的索引;同樣,當(dāng)修改現(xiàn)有記錄中引用列及其對(duì)應(yīng)的摘要列的列值后,數(shù)據(jù)庫(kù)將自動(dòng)按照修改后的摘要列值更新以該摘要列生成的索引。步驟330,當(dāng)對(duì)數(shù)據(jù)庫(kù)表的操作以引用列及其列值為條件時(shí),將條件中的引用列替換為對(duì)應(yīng)的摘要列,將條件中的引用列值替換為該引用列值的摘要值后,進(jìn)行該操作。當(dāng)業(yè)務(wù)功能模塊以引用列及其列值為條件對(duì)數(shù)據(jù)庫(kù)表進(jìn)行記錄的查詢、刪除、更新等操作時(shí),采用相應(yīng)的操作指令(如查詢指令、刪除指令或更新指令),調(diào)用訪問(wèn)控制功能模塊,該操作指令的條件中包括引用列及其列值。以引用列及其列值為條件,意味著操作所針對(duì)的記錄的是引用列的列值符合該條件的記錄。為了能夠利用所建立的索引提高對(duì)記錄的檢索速度,訪問(wèn)控制功能模塊在收到以引用列及其列值為條件的操作指令后,以該引用列對(duì)應(yīng)的摘要列替換條件中的引用列,以該引用列值的摘要值替換條件中的該引用列值,并執(zhí)行替換后的操作指令;換言之,訪問(wèn)控制模塊以對(duì)應(yīng)于該引用列的摘要列及其列值(該引用列值的摘要值)為條件,而不是以該引用列及其列值為條件,來(lái)對(duì)數(shù)據(jù)庫(kù)表進(jìn)行操作。可見(jiàn),本申請(qǐng)的實(shí)施例中,對(duì)列長(zhǎng)度可能超過(guò)最大索引長(zhǎng)度的引用列,在數(shù)據(jù)庫(kù)表中增加對(duì)應(yīng)的摘要列,用來(lái)保存引用列值的摘要值,采用摘要列來(lái)建立滿足長(zhǎng)度限制條件的索引,并且通過(guò)將數(shù)據(jù)庫(kù)表操作的條件中的引用列及其列值替換為對(duì)應(yīng)的摘要列及其列值,利用基于摘要列建立的索引來(lái)加快數(shù)據(jù)操作速度和業(yè)務(wù)響應(yīng)速度,同時(shí)由于無(wú)需限制引用列的長(zhǎng)度而不會(huì)損失業(yè)務(wù)數(shù)據(jù)的完整性。另外,對(duì)于需要以引用列值為基礎(chǔ)建立唯一性索引的應(yīng)用場(chǎng)景,現(xiàn)有技術(shù)中會(huì)因引用列長(zhǎng)度超過(guò)索引長(zhǎng)度限制而無(wú)法建立唯一性索引,導(dǎo)致數(shù)據(jù)庫(kù)表中可能存在相同的記錄。應(yīng)用本申請(qǐng)的實(shí)施例后,采用摘要列建立唯一性索引即可避免數(shù)據(jù)庫(kù)表中記錄重復(fù)的情況發(fā)生。在本申請(qǐng)的一個(gè)應(yīng)用示例中,業(yè)務(wù)系統(tǒng)通過(guò)數(shù)據(jù)庫(kù)中間件來(lái)對(duì)MySQL數(shù)據(jù)庫(kù)中的一張名為contact_way的表進(jìn)行操作。表contact_way用來(lái)保存用戶的聯(lián)系方式,其結(jié)構(gòu)如表1所示:表1表1中,列contact_way_id為contact_way表中的記錄編號(hào);列user_id為用戶標(biāo)識(shí),是contact_way表的主鍵;列contact_way_type為用戶的聯(lián)系方式類型;列contact_way_value為用戶的具體聯(lián)系方式信息;列g(shù)mt_modified為記錄的最后修改時(shí)間;列g(shù)mt_create為記錄的創(chuàng)建時(shí)間。contact_way表的建表DDL語(yǔ)句中記載了contact_way表的元數(shù)據(jù):createtablecontact_way(contact_way_idvarchar(32)notnullcomment'contactwayid',user_idvarchar(32)notnullcomment'userid',contact_way_typevarchar(20)notnullcomment'contactwaytype',contact_way_valuevarchar(2048)notnullcomment'contactwayvalue',gmt_modifiedtimestampnotnullcomment'lastmodifieddatetime',gmt_createtimestampnotnullcomment'createddatetime',primarykey(contact_way_id))comment='contactway';列contact_way_value采用UTF8字符集來(lái)保存用戶的聯(lián)系方式字符串,聯(lián)系方式字符串最大長(zhǎng)度為2048字符,這樣列contact_way_value的列長(zhǎng)度為9144字節(jié),已經(jīng)超過(guò)MySQL的最大索引長(zhǎng)度。由于需要以列contact_way_value為基礎(chǔ)來(lái)建立索引,則可以將列contact_way_value作為引用列。通過(guò)修改contact_way表的建表DDL語(yǔ)句,在contact_way表中增加引用列contact_way_value對(duì)應(yīng)的摘要列contact_way_value_digest_,采用摘要列contact_way_value_digest_建立兩個(gè)索引,分別是采用列user_id、列contact_way_type和摘要列contact_way_value_digest_建立的唯一性索引uk_contact_way,和采用摘要列contact_way_value_digest_、列contact_way_type和列contact_way_id建立的索引idx_value_type,修改后的DDL語(yǔ)句為:createtablecontact_way(contact_way_idvarchar(32)notnullcomment'contactwayid',user_idvarchar(32)notnullcomment'userid',contact_way_typevarchar(20)notnullcomment'contactwaytype',contact_way_valuevarchar(2048)notnullcomment'contactwayvalue',contact_way_value_digest_varchar(128)notnullcomment'contactwayvaluedigest',gmt_modifiedtimestampnotnullcomment'lastmodifieddatetime',gmt_createtimestampnotnullcomment'createddatetime',primarykey(contact_way_id))comment='contactway';createuniqueindexuk_contact_wayoncontact_way(user_id,contact_way_type,contact_way_value_digest_);createindexidx_value_typeoncontact_way(contact_way_value_digest_,contact_way_type,contact_way_id);本應(yīng)用示例中,摘要列的命名規(guī)則是:對(duì)應(yīng)的引用列列名+后綴'_digest_';摘要列值是對(duì)應(yīng)的引用列值的MD5(MessageDigestAlgorithm5,消息摘要算法第5版)值,摘要列的列長(zhǎng)度為32字節(jié)。對(duì)應(yīng)的摘要列發(fā)現(xiàn)規(guī)則為:列名以'_digest_'結(jié)尾并被索引引用,列名在'_digest_'的部分為對(duì)應(yīng)的引用列列名。數(shù)據(jù)庫(kù)中間件在啟動(dòng)運(yùn)行時(shí),從MySQL數(shù)據(jù)庫(kù)的information_schema庫(kù)(MySQL中用來(lái)訪問(wèn)數(shù)據(jù)庫(kù)表元數(shù)據(jù)的虛擬庫(kù))中,獲取表contact_way的元數(shù)據(jù),包括列名和索引定義。根據(jù)摘要列發(fā)現(xiàn)規(guī)則,數(shù)據(jù)庫(kù)中間件可以得知列contact_way_value_digest_為摘要列,對(duì)應(yīng)的引用列是contact_way_value。數(shù)據(jù)庫(kù)中間件緩存表contact_way中摘要列contact_way_value_digest_與引用列contact_way_value的對(duì)應(yīng)關(guān)系。MySQL數(shù)據(jù)庫(kù)采用SQL(StructuredQueryLanguage,結(jié)構(gòu)化查詢語(yǔ)言)語(yǔ)句來(lái)對(duì)數(shù)據(jù)庫(kù)表進(jìn)行訪問(wèn)。當(dāng)業(yè)務(wù)系統(tǒng)要在表contact_way中插入一條記錄時(shí),數(shù)據(jù)庫(kù)中間件收到如下insert指令:insertcontact_way(contact_way_id,user_id,contact_way_type,contact_way_value,gmt_create,gmt_modified)values('66660000000001','77770000000001','ADDRESS','JSONformattedlongaddressstring',now(),now());來(lái)自業(yè)務(wù)系統(tǒng)的insert指令中不包括摘要列以及要插入記錄中的摘要列值。數(shù)據(jù)庫(kù)中間件可以采用兩種方式來(lái)進(jìn)行該記錄的插入:第一種方式:數(shù)據(jù)庫(kù)中間件將來(lái)自業(yè)務(wù)系統(tǒng)的inset指令修改為:insertcontact_way(contact_way_id,user_id,contact_way_type,contact_way_value,contact_way_value_digest_,gmt_create,gmt_modified)values('66660000000001','77770000000001','ADDRESS','JSONformattedlongaddressstring','201e6c5491af0120d0bc7ca783f728bd',now(),now());并執(zhí)行修改后的insert指令,將該記錄插入表contact_way中,該記錄中摘要列的列值為引用列值的MD5值。第二種方式:數(shù)據(jù)庫(kù)中間件執(zhí)行來(lái)自業(yè)務(wù)系統(tǒng)的insert指令,在表contact_way中插入一條不包括摘要列值的記錄,然后生成并執(zhí)行如下update語(yǔ)句:updatecontact_waysetcontact_way_value_digest_='201e6c5491af0120d0bc7ca783f728bd'wherecontact_way_id='66660000000001';上述update指令將之前insert指令中插入記錄的摘要列值更新為引用列值的MD5值。當(dāng)業(yè)務(wù)系統(tǒng)對(duì)表contact_way進(jìn)行記錄查詢,并且查詢條件中包括引用列及其列值時(shí),數(shù)據(jù)庫(kù)中間件收到如下select指令:selectuser_idfromcontact_waywherecontact_way_value='JSONformattedlongaddressstring';數(shù)據(jù)庫(kù)中間件以對(duì)應(yīng)的摘要列替換條件中的引用列,以引用列值的MD5值替換條件中的引用列值,將select指令修改為:selectuser_idfromcontact_waywherecontact_way_value_digest_='201e6c5491af0120d0bc7ca783f728bd';并執(zhí)行修改后的select指令。當(dāng)業(yè)務(wù)系統(tǒng)對(duì)表contact_way進(jìn)行記錄刪除,并且刪除條件中包括引用列及其列值時(shí),數(shù)據(jù)庫(kù)中間件收到如下delete指令:deletefromcontact_waywherecontact_way_value='JSONformattedlongaddressstring';數(shù)據(jù)庫(kù)中間件以對(duì)應(yīng)的摘要列替換條件中的引用列,以引用列值的MD5值替換條件中的引用列值,將delete指令修改為:deletefromcontact_waywherecontact_way_value_digest_='201e6c5491af0120d0bc7ca783f728bd';并執(zhí)行修改后的delete指令。當(dāng)業(yè)務(wù)系統(tǒng)要更新表contact_way中一條記錄的引用列值、并且以引用列及其列值為條件時(shí),數(shù)據(jù)庫(kù)中間件收到如下update指令:updatecontact_waysetcontact_way_value='AnewJSONformattedlongaddressstring'whereuser_id='77770000000089'andcontact_way_type='ADDRESS'andcontact_way_value='JSONformattedlongaddressstring';來(lái)自業(yè)務(wù)系統(tǒng)的update指令中不包括摘要列以及應(yīng)隨引用列值刷新的摘要列值。數(shù)據(jù)庫(kù)中間件可以采用兩種方式來(lái)進(jìn)行該記錄的更新:第一種方式:數(shù)據(jù)庫(kù)中間件以對(duì)應(yīng)的摘要列替換條件中的引用列,以引用列值的MD5值替換條件中的引用列值,并且在要更新的列中增加摘要列及其列值,將來(lái)自業(yè)務(wù)系統(tǒng)的update指令修改為:updatecontact_waysetcontact_way_value='AnewJSONformattedlongaddressstring',contact_way_value_digest_='aff7f5cbc47e15e543ad04591265c117'whereuser_id='77770000000001'andcontact_way_type='ADDRESS'andcontact_way_value_digest_='201e6c5491af0120d0bc7ca783f728bd';并執(zhí)行修改后的update指令,將要更新記錄的引用列值刷新為指令中新的引用列值,并將該記錄的摘要列值刷新為指令中新引用列值的MD5值。第二種方式:數(shù)據(jù)庫(kù)中間件以對(duì)應(yīng)的摘要列替換條件中的引用列,以引用列值的MD5值替換條件中的引用列值,將來(lái)自業(yè)務(wù)系統(tǒng)的update指令修改為:updatecontact_waysetcontact_way_value='AnewJSONformattedlongaddressstring'whereuser_id='77770000000001'andcontact_way_type='ADDRESS'andcontact_way_value_digest_='201e6c5491af0120d0bc7ca783f728bd';執(zhí)行修改后的指令,將表contact_way中要更新記錄的引用列值刷新為指令中新的引用列值,然后生成并執(zhí)行如下update語(yǔ)句:updatecontact_waysetcontact_way_value_digest_='aff7f5cbc47e15e543ad04591265c117'whereuser_id='77770000000001'andcontact_way_type='ADDRESS'andcontact_way_value_digest_='201e6c5491af0120d0bc7ca783f728bd';第二條update指令將要更新記錄的摘要列值刷新為新引用列值的MD5值。這樣,本應(yīng)用示例中,通過(guò)在表contact_way中增加摘要列,并采用摘要列來(lái)建立索引,避開(kāi)了MySQL數(shù)據(jù)庫(kù)最大索引長(zhǎng)度的限制;基于數(shù)據(jù)庫(kù)表的元數(shù)據(jù),即可自動(dòng)發(fā)現(xiàn)表中的摘要列和對(duì)應(yīng)的引用列,新增索引只需改造建表DDL語(yǔ)句,簡(jiǎn)單有效,易于擴(kuò)展。與上述流程實(shí)現(xiàn)對(duì)應(yīng),本申請(qǐng)的實(shí)施例還提供了一種數(shù)據(jù)庫(kù)表索引的實(shí)現(xiàn)裝置。該裝置可以通過(guò)軟件實(shí)現(xiàn),也可以通過(guò)硬件或者軟硬件結(jié)合的方式實(shí)現(xiàn)。以軟件實(shí)現(xiàn)為例,作為邏輯意義上的裝置,是通過(guò)所在設(shè)備的CPU(CentralProcessUnit,中央處理器)將對(duì)應(yīng)的計(jì)算機(jī)程序指令讀取到內(nèi)存中運(yùn)行形成的。從硬件層面而言,除了圖4所示的CPU、內(nèi)存以及非易失性存儲(chǔ)器之外,數(shù)據(jù)庫(kù)表索引的實(shí)現(xiàn)裝置所在的設(shè)備通常還包括用于進(jìn)行無(wú)線信號(hào)收發(fā)的芯片等其他硬件,和/或用于實(shí)現(xiàn)網(wǎng)絡(luò)通信功能的板卡等其他硬件。圖5所示為本申請(qǐng)實(shí)施例提供的一種數(shù)據(jù)庫(kù)表索引的實(shí)現(xiàn)裝置,所述數(shù)據(jù)庫(kù)表包括至少一個(gè)用來(lái)建立索引的摘要列,每個(gè)摘要列對(duì)應(yīng)于一個(gè)所述數(shù)據(jù)庫(kù)表中的引用列,所述裝置包括對(duì)應(yīng)關(guān)系獲取單元、新增記錄處理單元和條件操作處理單元,其中:對(duì)應(yīng)關(guān)系獲取單元用于獲取所述數(shù)據(jù)庫(kù)表中摘要列和引用列的對(duì)應(yīng)關(guān)系;新增記錄處理單元用于當(dāng)在所述數(shù)據(jù)庫(kù)表中新增記錄時(shí),在所述記錄中與引用列對(duì)應(yīng)的摘要列保存所述引用列值的摘要值;條件操作處理單元用于當(dāng)對(duì)所述數(shù)據(jù)庫(kù)表的操作以引用列及其列值為條件時(shí),將條件中的引用列替換為對(duì)應(yīng)的摘要列,將條件中的引用列值替換為所述引用列值的摘要值后,進(jìn)行所述操作。一個(gè)例子中,所述對(duì)應(yīng)關(guān)系獲取單元具體用于:按照預(yù)定的摘要列發(fā)現(xiàn)規(guī)則,在所述數(shù)據(jù)庫(kù)表的元數(shù)據(jù)中發(fā)現(xiàn)摘要列與引用列的對(duì)應(yīng)關(guān)系。上述例子中,所述摘要列發(fā)現(xiàn)規(guī)則包括:摘要列的列名中包括預(yù)定摘要列標(biāo)志和所對(duì)應(yīng)的引用列列名,并被數(shù)據(jù)庫(kù)表的索引引用;摘要列的注釋中包括預(yù)定摘要列標(biāo)志和所對(duì)應(yīng)的引用列列名,并被數(shù)據(jù)庫(kù)表的索引引用;或,引用列的注釋中包括預(yù)定引用列標(biāo)志和所對(duì)應(yīng)的摘要列列名,并被數(shù)據(jù)庫(kù)表的索引引用。可選的,所述對(duì)應(yīng)關(guān)系獲取單元具體用于:讀取預(yù)定的配置文件,所述配置文件中保存有所述數(shù)據(jù)庫(kù)表中摘要列和引用列的對(duì)應(yīng)關(guān)系??蛇x的,所述新增記錄處理單元具體用于:修改插入記錄指令,在插入記錄指令中增加摘要列并以所述摘要列對(duì)應(yīng)的引用列值的摘要值作為其摘要列值,執(zhí)行修改后的插入記錄指令;或,執(zhí)行插入記錄指令在數(shù)據(jù)庫(kù)表中插入新增記錄,生成并執(zhí)行對(duì)所述新增記錄的更新指令,將所述新增記錄的摘要列值更新為與所述摘要列對(duì)應(yīng)的引用列值的摘要值。一種實(shí)現(xiàn)方式中,所述裝置還包括引用列值更新處理單元,用于當(dāng)修改所述數(shù)據(jù)庫(kù)表中記錄的引用列值時(shí),將所述記錄中與所述引用列對(duì)應(yīng)的摘要列值更新為修改后引用列值的摘要值。上述實(shí)現(xiàn)方式中,所述引用列值更新處理單元具體用于:修改對(duì)所述記錄的更新指令,在更新指令中增加與要修改列值的引用列對(duì)應(yīng)的摘要列,并以修改后引用列值的摘要值作為其摘要列值,執(zhí)行修改后的更新指令;或,執(zhí)行對(duì)所述記錄的更新指令,對(duì)所述記錄的引用列值進(jìn)行修改,生成并執(zhí)行對(duì)所述記錄的更新指令,將所述記錄中與被修改列值的引用列對(duì)應(yīng)的摘要列值更新為修改后引用列值的摘要值??蛇x的,所述對(duì)數(shù)據(jù)庫(kù)表的操作以引用列及其列值為條件,包括:對(duì)所述數(shù)據(jù)庫(kù)表的查詢指令、刪除指令或更新指令的條件中包括引用列及其列值??蛇x的,所述摘要值采用循環(huán)冗余檢驗(yàn)CRC、消息摘要法MD、或安全哈希算法SHA生成。以上所述僅為本申請(qǐng)的較佳實(shí)施例而已,并不用以限制本申請(qǐng),凡在本申請(qǐng)的精神和原則之內(nèi),所做的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本申請(qǐng)保護(hù)的范圍之內(nèi)。在一個(gè)典型的配置中,計(jì)算設(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ù)來(lái)實(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è)備訪問(wèn)的信息。按照本文中的界定,計(jì)算機(jī)可讀介質(zhì)不包括暫存電腦可讀媒體(transitorymedia),如調(diào)制的數(shù)據(jù)信號(hào)和載波。還需要說(shuō)明的是,術(shù)語(yǔ)“包括”、“包含”或者其任何其他變體意在涵蓋非排他性的包含,從而使得包括一系列要素的過(guò)程、方法、商品或者設(shè)備不僅包括那些要素,而且還包括沒(méi)有明確列出的其他要素,或者是還包括為這種過(guò)程、方法、商品或者設(shè)備所固有的要素。在沒(méi)有更多限制的情況下,由語(yǔ)句“包括一個(gè)……”限定的要素,并不排除在包括所述要素的過(guò)程、方法、商品或者設(shè)備中還存在另外的相同要素。本領(lǐng)域技術(shù)人員應(yīng)明白,本申請(qǐng)的實(shí)施例可提供為方法、系統(tǒng)或計(jì)算機(jī)程序產(chǎn)品。因此,本申請(qǐng)可采用完全硬件實(shí)施例、完全軟件實(shí)施例或結(jié)合軟件和硬件方面的實(shí)施例的形式。而且,本申請(qǐng)可采用在一個(gè)或多個(gè)其中包含有計(jì)算機(jī)可用程序代碼的計(jì)算機(jī)可用存儲(chǔ)介質(zhì)(包括但不限于磁盤存儲(chǔ)器、CD-ROM、光學(xué)存儲(chǔ)器等)上實(shí)施的計(jì)算機(jī)程序產(chǎn)品的形式。當(dāng)前第1頁(yè)1 2 3 當(dāng)前第1頁(yè)1 2 3