欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

一種索引建立方法及設(shè)備與流程

文檔序號(hào):12596309閱讀:281來(lái)源:國(guó)知局
一種索引建立方法及設(shè)備與流程

本發(fā)明涉及通信技術(shù)領(lǐng)域,特別涉及一種索引建立方法,本申請(qǐng)同時(shí)還涉及一種索引建立設(shè)備。



背景技術(shù):

索引是對(duì)數(shù)據(jù)庫(kù)表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu),使用索引可快速訪問(wèn)數(shù)據(jù)庫(kù)表中的特定信息。索引提供指向存儲(chǔ)在表的指定列中的數(shù)據(jù)值的指針,然后根據(jù)用戶指定的排序順序?qū)@些指針排序。當(dāng)需要在數(shù)據(jù)庫(kù)中使用索引時(shí),首先搜索索引以找到特定值,然后順指針找到包含該值的行。

隨著互聯(lián)網(wǎng)技術(shù)的不斷發(fā)展,人們每天通過(guò)互聯(lián)網(wǎng)的活動(dòng)將產(chǎn)生海量的數(shù)據(jù),在將這些海量的數(shù)據(jù)進(jìn)行存儲(chǔ)之后,如何從中快速檢索需要的數(shù)據(jù)成為了技術(shù)人員首要考慮的問(wèn)題。傳統(tǒng)數(shù)據(jù)庫(kù)的索引都是需要用戶自己指定索引類型,然而同一種索引類型在面對(duì)不同的數(shù)據(jù)類型時(shí)的查詢時(shí)間也是不一樣的,所以當(dāng)索引類型設(shè)置不當(dāng)?shù)那闆r下,用戶在數(shù)據(jù)庫(kù)的查詢時(shí)間將會(huì)變得十分漫長(zhǎng),從而給用戶帶來(lái)的不良的使用體驗(yàn)。

在實(shí)現(xiàn)本申請(qǐng)的過(guò)程中,發(fā)明人發(fā)現(xiàn)現(xiàn)有技術(shù)存在著以下缺陷:

(1)現(xiàn)有索引類型單一,導(dǎo)致某些場(chǎng)景查詢性能差。

傳統(tǒng)數(shù)據(jù)的索引類型較為單一、以B-Tree(B樹(shù))索引為主,并不是所有數(shù)據(jù)特征都適合B-Tree索引,比如Key-Value(鍵-值)模式查找速度很慢。在帶有Join(聯(lián)接)的SQL(Structured Query Language,結(jié)構(gòu)化查詢語(yǔ)言)中,一條SQL會(huì)進(jìn)行多次查找。如果采用B-Tree查找的話嚴(yán)重影響join SQL的性能。

(2)通過(guò)人工分析日志優(yōu)化索引,導(dǎo)致可運(yùn)維性差。

傳統(tǒng)數(shù)據(jù)庫(kù)在大量數(shù)據(jù)的場(chǎng)景下,索引帶來(lái)的維護(hù)開(kāi)銷是很大,因此需要每天晚上看下用戶訪問(wèn)的日志來(lái)決定哪些列增加新索引、哪些列不需要索引、以及哪些列聯(lián)合起來(lái)建組合索引。這種利用歷史統(tǒng)計(jì)(HBO)自動(dòng)調(diào)整索引類型完全是人工的,使得可運(yùn)維性很差。

由此可見(jiàn),如何結(jié)合數(shù)據(jù)庫(kù)的使用情況為其中各列建立合適的索引,以提高數(shù)據(jù)檢索效率以及減少運(yùn)維資源,成為本領(lǐng)域技術(shù)人員亟待解決的技術(shù)問(wèn)題。



技術(shù)實(shí)現(xiàn)要素:

本發(fā)明提供了一種索引建立方法。用以對(duì)索引建立流程進(jìn)行優(yōu)化,在提高數(shù)據(jù)檢索效率的同時(shí)減少人力的消耗,該方法包括以下步驟:

根據(jù)數(shù)據(jù)庫(kù)中的列在預(yù)設(shè)的時(shí)間閾值內(nèi)的索引狀態(tài)信息確定是否需要為所述列建立索引;

若確定需要為所述列建立索引,根據(jù)所述列的數(shù)據(jù)信息確定索引類型,并按照所述索引類型為所述列建立索引。

優(yōu)選地,還包括:

若確定無(wú)需為所述列建立索引,在所述時(shí)間閾值后根據(jù)所述列在所述時(shí)間閾值內(nèi)的索引使用狀況信息確定是否需要為所述列建立索引。

優(yōu)選地,根據(jù)數(shù)據(jù)庫(kù)中的列在預(yù)設(shè)的時(shí)間閾值內(nèi)的索引狀態(tài)信息確定是否需要為所述列建立索引,具體為:

獲取所述列在所述時(shí)間閾值內(nèi)的所述索引狀態(tài)信息;

根據(jù)所述索引狀態(tài)信息判斷所述列在所述時(shí)間閾值內(nèi)是否使用索引,并在判斷結(jié)果為是時(shí)判斷所述列在所述時(shí)間閾值內(nèi)使用索引的次數(shù)是否不小于預(yù)設(shè)的次數(shù)閾值;

若所述列在所述時(shí)間閾值內(nèi)未使用索引或所述列在在所述時(shí)間閾值內(nèi)使 用索引的次數(shù)小于所述次數(shù)閾值,確認(rèn)無(wú)需為所述列建立索引;

若所述列在在所述時(shí)間閾值內(nèi)使用索引的次數(shù)不小于所述次數(shù)閾值,確定需要為所述列建立索引。

優(yōu)選地,所述索引類型至少包括B-Tree索引、Hash索引、Bitmap索引,根據(jù)所述列的數(shù)據(jù)信息確定索引類型,具體為:

若所述列為連續(xù)型數(shù)值類型,確定所述索引類型為所述B-Tree索引;

若所述列會(huì)發(fā)生Join,確定所述索引類型為所述Hash索引;

若所述列的詞數(shù)大于預(yù)設(shè)的詞數(shù)閾值,確定所述索引類型為倒排索引;

若所述列詞數(shù)不大于預(yù)設(shè)的詞數(shù)閾值,且不會(huì)發(fā)生Join以及非連續(xù)型數(shù)值類型,確定所述索引類型為所述位圖索引。

優(yōu)選地,還包括:

當(dāng)接收到用戶發(fā)送的檢索表達(dá)式時(shí),將所述檢索表達(dá)式拆分為多個(gè)子表達(dá)式;

在緩存中查詢是否存在與各所述子表達(dá)式對(duì)應(yīng)的檢索結(jié)果;

若存在與所述子表達(dá)式對(duì)應(yīng)的檢索結(jié)果,根據(jù)所述檢索結(jié)果以及其他子表達(dá)式的檢索結(jié)果生成用于向所述用戶返回的檢索響應(yīng);

若不存在與所述子表達(dá)式對(duì)應(yīng)的檢索結(jié)果,利用所述列的索引對(duì)所述子表達(dá)式進(jìn)行檢索,并在根據(jù)所述檢索結(jié)果以及其他子表達(dá)式的檢索結(jié)果生成用于向所述用戶返回的檢索響應(yīng)之后,將檢索結(jié)果存儲(chǔ)與所述緩存。

優(yōu)選地,在根據(jù)數(shù)據(jù)庫(kù)中的列在預(yù)設(shè)的時(shí)間閾值內(nèi)的索引狀態(tài)信息確定是否需要為所述列建立索引之前,還包括:

當(dāng)所述數(shù)據(jù)庫(kù)初始化完成后,按照默認(rèn)的索引類型為所述數(shù)據(jù)庫(kù)中的各個(gè)列構(gòu)建索引,并在達(dá)到預(yù)設(shè)的時(shí)刻重新為各所述列構(gòu)建索引。

相應(yīng)地,本申請(qǐng)還提出了一種索引建立設(shè)備,包括:

確定模塊,根據(jù)數(shù)據(jù)庫(kù)中的列在預(yù)設(shè)的時(shí)間閾值內(nèi)的索引狀態(tài)信息確定是否需要為所述列建立索引;

建立模塊,在所述確定模塊確定需要為所述列建立索引時(shí)根據(jù)所述列的數(shù)據(jù)信息確定索引類型,并按照所述索引類型為所述列建立索引。

優(yōu)選地,所述建立模塊,還在所述確定模塊確定無(wú)需為所述列建立索引時(shí),在所述時(shí)間閾值后根據(jù)所述列在所述時(shí)間閾值內(nèi)的索引使用狀況信息確定是否需要為所述列建立索引。

優(yōu)選地,所述確定模塊具體用于:

獲取所述列在所述時(shí)間閾值內(nèi)的所述索引狀態(tài)信息;

根據(jù)所述索引狀態(tài)信息判斷所述列在所述時(shí)間閾值內(nèi)是否使用索引,并在判斷結(jié)果為是時(shí)判斷所述列在所述時(shí)間閾值內(nèi)使用索引的次數(shù)是否不小于預(yù)設(shè)的次數(shù)閾值;

若所述列在所述時(shí)間閾值內(nèi)未使用索引或所述列在在所述時(shí)間閾值內(nèi)使用索引的次數(shù)小于所述次數(shù)閾值,確認(rèn)無(wú)需為所述列建立索引;

若所述列在在所述時(shí)間閾值內(nèi)使用索引的次數(shù)不小于所述次數(shù)閾值,確定需要為所述列建立索引。

優(yōu)選地,所述索引類型至少包括B-Tree索引、Hash索引、Bitmap索引,所述建立模塊根據(jù)所述列的數(shù)據(jù)信息確定索引類型,具體為:

若所述列為連續(xù)型數(shù)值類型,確定所述索引類型為所述B-Tree索引;

若所述列會(huì)發(fā)生Join,確定所述索引類型為所述Hash索引;

若所述列的詞數(shù)大于預(yù)設(shè)的詞數(shù)閾值,確定所述索引類型為倒排索引;

若所述列詞數(shù)不大于預(yù)設(shè)的詞數(shù)閾值,且不會(huì)發(fā)生Join以及非連續(xù)型數(shù)值類型,確定所述索引類型為所述位圖索引。

優(yōu)選地,還包括:

拆分模塊,當(dāng)接收到用戶發(fā)送的檢索表達(dá)式時(shí),將所述檢索表達(dá)式拆分 為多個(gè)子表達(dá)式;

查詢模塊,在緩存中查詢是否存在與各所述子表達(dá)式對(duì)應(yīng)的檢索結(jié)果;

處理模塊,在存在與所述子表達(dá)式對(duì)應(yīng)的檢索結(jié)果時(shí)根據(jù)所述檢索結(jié)果以及其他子表達(dá)式的檢索結(jié)果生成用于向所述用戶返回的檢索響應(yīng),以及在不存在與所述子表達(dá)式對(duì)應(yīng)的檢索結(jié)果時(shí)利用所述列的索引對(duì)所述子表達(dá)式進(jìn)行檢索,并在根據(jù)所述檢索結(jié)果以及其他子表達(dá)式的檢索結(jié)果生成用于向所述用戶返回的檢索響應(yīng)之后將檢索結(jié)果存儲(chǔ)與所述緩存。

優(yōu)選地,還包括:

初始化模塊,當(dāng)所述數(shù)據(jù)庫(kù)初始化完成后,按照默認(rèn)的索引類型為所述數(shù)據(jù)庫(kù)中的各個(gè)列構(gòu)建索引,并在達(dá)到預(yù)設(shè)的時(shí)刻重新為各所述列構(gòu)建索引。

由此可見(jiàn),通過(guò)應(yīng)用本申請(qǐng)的技術(shù)方案,首先根據(jù)數(shù)據(jù)庫(kù)中的列在預(yù)設(shè)的時(shí)間閾值內(nèi)的索引狀態(tài)信息確定是否需要為該列建立索引,并在確定需要為其建立索引時(shí)根據(jù)該列的數(shù)據(jù)信息確定索引類型,以及按照索引類型為該列建立索引。從而實(shí)現(xiàn)了數(shù)據(jù)庫(kù)各列的動(dòng)態(tài)索引建立,并且能夠根據(jù)實(shí)際情況選擇合適的索引類型,在減少資源消耗以及人力投入的前提下有效提高數(shù)據(jù)檢索效率。

附圖說(shuō)明

圖1為本申請(qǐng)?zhí)岢龅囊环N索引建立方法的流程示意圖;

圖2為本申請(qǐng)具體實(shí)施例中的一種數(shù)據(jù)結(jié)構(gòu)示意圖;

圖3為本申請(qǐng)具體實(shí)施例提出的一種流式結(jié)果歸并流程示意圖;

圖4為本申請(qǐng)具體實(shí)施例提出的一種索引結(jié)構(gòu)示意圖;

圖5為本申請(qǐng)具體實(shí)施例提出的一種索引建立流程示意圖;

圖6為本申請(qǐng)?zhí)岢龅囊环N索引建立設(shè)備的結(jié)構(gòu)示意圖。

具體實(shí)施方式

有鑒于背景技術(shù)中的問(wèn)題,本申請(qǐng)?zhí)岢隽艘环N索引建立方法。通過(guò)針對(duì)數(shù)據(jù)庫(kù)中各個(gè)列的索引使用情況及時(shí)判斷是否需要為其建立索引,以及在建立索引時(shí)結(jié)合該列的數(shù)據(jù)信息選擇合適的索引類型。從而在節(jié)省硬件資源以及人力投入的前提下提高檢索效率。

如圖1所示,為本申請(qǐng)?zhí)岢龅囊环N索引建立方法的流程示意圖,包括以下步驟:

S101,根據(jù)數(shù)據(jù)庫(kù)中的列在預(yù)設(shè)的時(shí)間閾值內(nèi)的索引狀態(tài)信息確定是否需要為所述列建立索引。

若確定需要為所述列建立索引,執(zhí)行步驟S102;

若確定不需要為所述列建立索引,則返回步驟S101,繼續(xù)在下一個(gè)預(yù)設(shè)的時(shí)間閾值所對(duì)應(yīng)的時(shí)間區(qū)間內(nèi),確定是否需要為所述列建立索引。

在面對(duì)海量數(shù)據(jù)的情況下,針對(duì)數(shù)據(jù)庫(kù)中的每一列都建立與其對(duì)應(yīng)的索引是耗時(shí)耗力且不必要的,因?yàn)椴皇撬械牧卸紩?huì)時(shí)常被用戶檢索或查詢。因此本申請(qǐng)針對(duì)數(shù)據(jù)庫(kù)中的每個(gè)列都引入了索引狀態(tài)信息,并基于一段時(shí)間內(nèi)的索引狀態(tài)信息確定是否需要為該列建立索引。同時(shí)為了保證各個(gè)列的索引狀態(tài)信息能夠及時(shí)地根據(jù)用戶的檢索方式以及習(xí)慣進(jìn)行調(diào)整,本申請(qǐng)每個(gè)時(shí)間閾值后針對(duì)各個(gè)列的索引狀態(tài)信息進(jìn)行更新以及判斷,例如該時(shí)間閾值內(nèi)該列是否使用過(guò)索引,以及使用索引是否達(dá)到一定的次數(shù)。在具體的應(yīng)用場(chǎng)景中,該時(shí)間閾值具體為一個(gè)預(yù)設(shè)的時(shí)間區(qū)間值,表征統(tǒng)計(jì)相應(yīng)的列的索引使用情況的統(tǒng)計(jì)時(shí)間范圍,可根據(jù)數(shù)據(jù)庫(kù)的容量以及使用用戶的數(shù)量進(jìn)行調(diào)整,一般情況下可設(shè)置為一天,在此基礎(chǔ)上技術(shù)人員可以將其延長(zhǎng)或是縮短,這些都屬于本申請(qǐng)的保護(hù)范圍。

在本申請(qǐng)的優(yōu)選實(shí)施例中,針對(duì)該步驟提出了具體的判斷方式,包括如下步驟:

步驟a)獲取所述列在所述時(shí)間閾值內(nèi)的所述索引狀態(tài)信息。

步驟b)根據(jù)所述索引狀態(tài)信息判斷所述列在所述時(shí)間閾值內(nèi)是否使用索引,并在判斷結(jié)果為是時(shí)判斷所述列在所述時(shí)間閾值內(nèi)使用索引的次數(shù)是否不小于預(yù)設(shè)的次數(shù)閾值。

基于上述判斷步驟,若所述列在所述時(shí)間閾值內(nèi)未使用索引或所述列在在所述時(shí)間閾值內(nèi)使用索引的次數(shù)小于所述次數(shù)閾值,確認(rèn)無(wú)需為所述列建立索引;若所述列在在所述時(shí)間閾值內(nèi)使用索引的次數(shù)不小于所述次數(shù)閾值,確定需要為所述列建立索引。

需要說(shuō)明的是,盡管以上實(shí)施例以特定的步驟以及判斷依據(jù)實(shí)現(xiàn)了是否需要為列建立索引的判斷,然而本領(lǐng)域技術(shù)人員可以在此基礎(chǔ)上采用其他類型的依據(jù)進(jìn)行判斷,這些改進(jìn)都屬于本申請(qǐng)的保護(hù)范圍。

另外,當(dāng)數(shù)據(jù)庫(kù)初始化完畢時(shí),此時(shí)數(shù)據(jù)庫(kù)中的列都是沒(méi)有建立索引的,此時(shí)本申請(qǐng)將按照默認(rèn)的索引類型為所述數(shù)據(jù)庫(kù)中的各個(gè)列構(gòu)建索引,并在達(dá)到預(yù)設(shè)的時(shí)刻重新為各所述列構(gòu)建索引,在該過(guò)程中所統(tǒng)一建立的索引可以由技術(shù)人員預(yù)先設(shè)置。

S102,根據(jù)所述列的數(shù)據(jù)信息確定索引類型,并按照所述索引類型為所述列建立索引。

在通過(guò)S101確定該列需要建立索引后,即可根據(jù)該列的數(shù)據(jù)信息確定索引類型,從而能夠基于不同的情況為用戶提供個(gè)性化的檢索服務(wù),大大地減少所有用戶在查詢當(dāng)前數(shù)據(jù)庫(kù)過(guò)程中所平均花費(fèi)的時(shí)間。

相反地,如步驟S101中的說(shuō)明,在確定無(wú)需為所述列建立索引的情況下,本申請(qǐng)的技術(shù)方案也將在當(dāng)前的時(shí)間閾值所對(duì)應(yīng)的時(shí)間區(qū)間結(jié)束后,重新根據(jù)所述列在下一個(gè)時(shí)間閾值所對(duì)應(yīng)的時(shí)間區(qū)間內(nèi)的索引使用狀況信息確定是否需要為所述列建立索引,即重新執(zhí)行步驟S101,從而能夠根據(jù)實(shí)際情況靈活進(jìn)行調(diào)整。

由于目前使用較多的索引類型包括倒排(Invert)索引、B-Tree索引、Hash索引、Bitmap索引,因此在本申請(qǐng)的優(yōu)選實(shí)施例中,具體通過(guò)以下條件確定索引類型,:

(1)若所述列為連續(xù)型數(shù)值類型,確定所述索引類型為所述B-Tree索引。

(2)若所述列會(huì)發(fā)生Join,確定所述索引類型為所述Hash索引。

需要說(shuō)明的是,Join是關(guān)系型數(shù)據(jù)庫(kù)系統(tǒng)的重要操作之一,SQL Server中包含的常用Join包括:內(nèi)聯(lián)接、外聯(lián)接和交叉聯(lián)接等。如果需要在兩個(gè)或以上的表中,獲取一個(gè)表中的行與另一個(gè)表中的行相匹配的數(shù)據(jù),則需要考慮使用Join操作,因?yàn)镴oin具有聯(lián)接表或函數(shù)進(jìn)行查詢的特性。

(3)若所述列的詞數(shù)大于預(yù)設(shè)的詞數(shù)閾值,確定所述索引類型為倒排索引。

其中,所述列的詞數(shù)具體為該列所包含的變量值的數(shù)量。

(4)若所述列詞數(shù)不大于預(yù)設(shè)的詞數(shù)閾值,且不會(huì)發(fā)生Join以及非連續(xù)型數(shù)值類型,確定所述索引類型為所述位圖索引。

在本申請(qǐng)的具體實(shí)施例中,如果某一列數(shù)據(jù)是數(shù)值類型并且是連續(xù)型(例如金額),那么這種數(shù)值類型的字段一般只需要進(jìn)行范圍查詢,而如圖2所示的數(shù)據(jù)結(jié)構(gòu)圖,B-Tree這種數(shù)據(jù)結(jié)構(gòu)中間節(jié)點(diǎn)天生具備范圍屬性,所以在面對(duì)連續(xù)型數(shù)值類型的列時(shí),B-Tree索引的范圍查找效率遠(yuǎn)高于倒排索引和位圖索引。

此外,假設(shè)整個(gè)索引片中有n條記錄,字段A有x個(gè)不同的term值,"delta+vint"原始?jí)嚎s算法的壓縮比為p,那么通過(guò)“x*n/32<n*4*p”的變換等式“x<128*p”以及“"delta+vint"壓縮算法的最大壓縮比為1/4”可以得到如下結(jié)果:

當(dāng)p=1/4時(shí),代入“x<128*p”可以得到x<128*1/4=32。

基于上述結(jié)果可以看出,只要詞數(shù)小于32使用位圖索引就比倒排索引節(jié)省空間,因此在上述優(yōu)選實(shí)施例中詞數(shù)閾值可具體設(shè)置為32。但同樣需要指出的是,該詞數(shù)閾值可以在后續(xù)基于其他的算法進(jìn)行修改,這并不影響本申請(qǐng)的保護(hù)范圍。

此外,現(xiàn)有技術(shù)中在執(zhí)行完一次用戶的查詢之后,并不會(huì)保存與之相關(guān)的任何結(jié)果信息,而通常情況下用戶的查詢表達(dá)式一般都是由多個(gè)不同的子表達(dá)式所組成的,因此在傳統(tǒng)數(shù)據(jù)庫(kù)沒(méi)有原子表達(dá)式緩存的情況下,有相同表達(dá)式的不同SQL無(wú)法復(fù)用子表達(dá)式的查詢結(jié)果,從而導(dǎo)致了沒(méi)有原子表達(dá)式緩存導(dǎo)致OLAP(Online Analytical Processing,聯(lián)機(jī)分析處理)任意維度布爾運(yùn)算性能差。為此本申請(qǐng)優(yōu)選實(shí)施例提出了一種解決方案,在當(dāng)接收到用戶發(fā)送的檢索表達(dá)式時(shí),將所述檢索表達(dá)式拆分為多個(gè)子表達(dá)式,并在緩存中查詢是否存在與各所述子表達(dá)式對(duì)應(yīng)的檢索結(jié)果,基于以下情況處理:

(1)若存在與所述子表達(dá)式對(duì)應(yīng)的檢索結(jié)果,根據(jù)所述檢索結(jié)果以及其他子表達(dá)式的檢索結(jié)果生成用于向所述用戶返回的檢索響應(yīng);

(2)若不存在與所述子表達(dá)式對(duì)應(yīng)的檢索結(jié)果,利用所述列的索引對(duì)所述子表達(dá)式進(jìn)行檢索,并在根據(jù)所述檢索結(jié)果以及其他子表達(dá)式的檢索結(jié)果生成用于向所述用戶返回的檢索響應(yīng)之后,將檢索結(jié)果存儲(chǔ)于所述緩存。

以圖3所示的流式結(jié)果歸并流程示意圖為例,查詢索引解壓出來(lái)的倒排鏈在內(nèi)存是以bitmap(位圖)結(jié)構(gòu)存放的。這套流式歸并框架就是在不產(chǎn)生任何中間對(duì)象的前提下將各個(gè)表達(dá)式之間的布爾運(yùn)算一條一條歸并出來(lái)。整個(gè)流式歸并過(guò)程包括以下4部分:

(1)QueryBuilder(隊(duì)列創(chuàng)建組件)根據(jù)where表達(dá)式生成EngineQuery(隊(duì)列引擎)對(duì)象樹(shù)。

(2)根據(jù)EngineQuery對(duì)象樹(shù)構(gòu)造RowidElector(列標(biāo)識(shí)選舉)選舉樹(shù)。

(3)從不同索引拿到RowidSet(列標(biāo)識(shí)集合)掛在葉子節(jié)點(diǎn)上,中間節(jié)點(diǎn)是邏輯運(yùn)算合并器。

(4)從根節(jié)點(diǎn)一條一條選舉,并收集Rowid(列標(biāo)識(shí))。

該具體實(shí)施例是基于不同的SQL語(yǔ)句可能有相同的where子表達(dá)式的情況,因此通過(guò)將原子表達(dá)式進(jìn)行緩存來(lái)加快索引的查詢性能。

通過(guò)應(yīng)用以上技術(shù)方案,基于列級(jí)別獨(dú)立的索引結(jié)構(gòu),根據(jù)成本和代價(jià)自動(dòng)選擇最合適的索引類型,并利用歷史統(tǒng)計(jì)(HBO)自動(dòng)調(diào)整索引類型,同時(shí)進(jìn)程原子表達(dá)式的緩存,從而在節(jié)省存儲(chǔ)成本的同時(shí)加快了索引的查詢性能。

為了進(jìn)一步闡述本發(fā)明的技術(shù)思想,現(xiàn)結(jié)合圖4所示的索引結(jié)構(gòu)圖對(duì)本發(fā)明的技術(shù)方案進(jìn)行說(shuō)明。該具體實(shí)施例基于倒排索引、位圖索引、Hash索引、B-Tree索引等索引的原理、特性,自主實(shí)現(xiàn)了圖4所示的列級(jí)別的索引架構(gòu),可同時(shí)支持4中索引類型。索引類型對(duì)用戶透明,不需要用戶外部指定,而是根據(jù)數(shù)據(jù)特征自動(dòng)選擇索引類型。同時(shí)多種索引類型采用同一套數(shù)據(jù)結(jié)構(gòu)做布爾運(yùn)算,對(duì)于引擎層可以不用感知where子表達(dá)式的結(jié)果從什么索引查出來(lái)的。另外,索引可根據(jù)歷史統(tǒng)計(jì)信息自動(dòng)優(yōu)化,無(wú)需人工參與。

具體地,該索引結(jié)構(gòu)圖主要包含以下3部分:

(1)流式結(jié)果歸并器(Streamed Merger):負(fù)責(zé)統(tǒng)一不同索引查詢結(jié)果和計(jì)算層之間的交互。不同的索引查詢出來(lái)的結(jié)果均以bitmap進(jìn)行存儲(chǔ),然后根據(jù)where表達(dá)式的布爾運(yùn)算生成流式歸并樹(shù),再通過(guò)歸并器逐條輸出滿足where條件的行號(hào)。

(2)索引管理器(Index Manager):負(fù)責(zé)管理索引,選擇類型及自動(dòng)優(yōu)化索引流程。

(3)子表達(dá)式緩存(BitmapCache):負(fù)責(zé)緩存where子表達(dá)式,這樣不 同SQL有相同子表達(dá)式不再需要查詢索引,可以直接在cache(緩存)中進(jìn)行查詢。

基于上述說(shuō)明,在圖5所示的索引建立流程示意圖中,首先針對(duì)數(shù)據(jù)庫(kù)中的每一列建立索引,并且每天都會(huì)重新建立索引并獲取歷史SQL統(tǒng)計(jì)數(shù)據(jù),并基于該歷史數(shù)據(jù)針對(duì)該列在當(dāng)天是否使用索引以及使用索引的次數(shù)是否超過(guò)閾值進(jìn)行判斷。在確定需要為該列建立索引后,根據(jù)該列的數(shù)據(jù)的類型選擇不同的索引類型。從而不僅能夠支持不同列字段采用不同索引類型(同時(shí)支持倒排索引、B-Tree索引、Bitmap索引和Hash索引),而且索引類型的選擇可以做到對(duì)用戶無(wú)感知,大大節(jié)省存儲(chǔ)成本以及提高查詢速度。

為達(dá)到以上技術(shù)目的,本申請(qǐng)還提出了一種索引建立設(shè)備,如圖6所示,包括:

確定模塊610,根據(jù)數(shù)據(jù)庫(kù)中的列在預(yù)設(shè)的時(shí)間閾值內(nèi)的索引狀態(tài)信息確定是否需要為所述列建立索引;

建立模塊620,在所述確定模塊確定需要為所述列建立索引時(shí)根據(jù)所述列的數(shù)據(jù)信息確定索引類型,并按照所述索引類型為所述列建立索引。

在具體的應(yīng)用場(chǎng)景中,所述建立模塊,還在所述確定模塊確定無(wú)需為所述列建立索引時(shí),在所述時(shí)間閾值后根據(jù)所述列在所述時(shí)間閾值內(nèi)的索引使用狀況信息確定是否需要為所述列建立索引。

在具體的應(yīng)用場(chǎng)景中,所述確定模塊具體用于:

獲取所述列在所述時(shí)間閾值內(nèi)的所述索引狀態(tài)信息;

根據(jù)所述索引狀態(tài)信息判斷所述列在所述時(shí)間閾值內(nèi)是否使用索引,并在判斷結(jié)果為是時(shí)判斷所述列在所述時(shí)間閾值內(nèi)使用索引的次數(shù)是否不小于預(yù)設(shè)的次數(shù)閾值;

若所述列在所述時(shí)間閾值內(nèi)未使用索引或所述列在在所述時(shí)間閾值內(nèi)使 用索引的次數(shù)小于所述次數(shù)閾值,確認(rèn)無(wú)需為所述列建立索引;

若所述列在在所述時(shí)間閾值內(nèi)使用索引的次數(shù)不小于所述次數(shù)閾值,確定需要為所述列建立索引。

在具體的應(yīng)用場(chǎng)景中,所述索引類型至少包括B-Tree索引、Hash索引、Bitmap索引,所述建立模塊根據(jù)所述列的數(shù)據(jù)信息確定索引類型,具體為:

若所述列為連續(xù)型數(shù)值類型,確定所述索引類型為所述B-Tree索引;

若所述列會(huì)發(fā)生Join,確定所述索引類型為所述Hash索引;

若所述列的詞數(shù)大于預(yù)設(shè)的詞數(shù)閾值,確定所述索引類型為倒排索引;

若所述列詞數(shù)不大于預(yù)設(shè)的詞數(shù)閾值,且不會(huì)發(fā)生Join以及非連續(xù)型數(shù)值類型,確定所述索引類型為所述位圖索引。

在具體的應(yīng)用場(chǎng)景中,還包括:

拆分模塊,當(dāng)接收到用戶發(fā)送的檢索表達(dá)式時(shí),將所述檢索表達(dá)式拆分為多個(gè)子表達(dá)式;

查詢模塊,在緩存中查詢是否存在與各所述子表達(dá)式對(duì)應(yīng)的檢索結(jié)果;

處理模塊,在存在與所述子表達(dá)式對(duì)應(yīng)的檢索結(jié)果時(shí)根據(jù)所述檢索結(jié)果以及其他子表達(dá)式的檢索結(jié)果生成用于向所述用戶返回的檢索響應(yīng),以及在不存在與所述子表達(dá)式對(duì)應(yīng)的檢索結(jié)果時(shí)利用所述列的索引對(duì)所述子表達(dá)式進(jìn)行檢索,并在根據(jù)所述檢索結(jié)果以及其他子表達(dá)式的檢索結(jié)果生成用于向所述用戶返回的檢索響應(yīng)之后將檢索結(jié)果存儲(chǔ)與所述緩存。

在具體的應(yīng)用場(chǎng)景中,還包括:

初始化模塊,當(dāng)所述數(shù)據(jù)庫(kù)初始化完成后,按照默認(rèn)的索引類型為所述數(shù)據(jù)庫(kù)中的各個(gè)列構(gòu)建索引,并在達(dá)到預(yù)設(shè)的時(shí)刻重新為各所述列構(gòu)建索引。

通過(guò)應(yīng)用本申請(qǐng)的技術(shù)方案,首先根據(jù)數(shù)據(jù)庫(kù)中的列在預(yù)設(shè)的時(shí)間閾值內(nèi)的索引狀態(tài)信息確定是否需要為該列建立索引,并在確定需要為建立索引 時(shí)根據(jù)該列的數(shù)據(jù)信息確定索引類型,以及按照索引類型為該列建立索引。從而實(shí)現(xiàn)了數(shù)據(jù)庫(kù)各列的動(dòng)態(tài)索引建立,并且能夠根據(jù)實(shí)際情況選擇合適的索引類型,在減少資源消耗以及人力投入的前提下有效提高數(shù)據(jù)檢索效率。

通過(guò)以上的實(shí)施方式的描述,本領(lǐng)域的技術(shù)人員可以清楚地了解到本發(fā)明可以通過(guò)硬件實(shí)現(xiàn),也可以借助軟件加必要的通用硬件平臺(tái)的方式來(lái)實(shí)現(xiàn)。基于這樣的理解,本發(fā)明的技術(shù)方案可以以軟件產(chǎn)品的形式體現(xiàn)出來(lái),該軟件產(chǎn)品可以存儲(chǔ)在一個(gè)非易失性存儲(chǔ)介質(zhì)(可以是CD-ROM,U盤,移動(dòng)硬盤等)中,包括若干指令用以使得一臺(tái)計(jì)算機(jī)設(shè)備(可以是個(gè)人計(jì)算機(jī),服務(wù)器,或者網(wǎng)絡(luò)設(shè)備等)執(zhí)行本發(fā)明各個(gè)實(shí)施場(chǎng)景所述的方法。

本領(lǐng)域技術(shù)人員可以理解附圖只是一個(gè)優(yōu)選實(shí)施場(chǎng)景的示意圖,附圖中的模塊或流程并不一定是實(shí)施本發(fā)明所必須的。

本領(lǐng)域技術(shù)人員可以理解實(shí)施場(chǎng)景中的裝置中的模塊可以按照實(shí)施場(chǎng)景描述進(jìn)行分布于實(shí)施場(chǎng)景的裝置中,也可以進(jìn)行相應(yīng)變化位于不同于本實(shí)施場(chǎng)景的一個(gè)或多個(gè)裝置中。上述實(shí)施場(chǎng)景的模塊可以合并為一個(gè)模塊,也可以進(jìn)一步拆分成多個(gè)子模塊。

上述本發(fā)明序號(hào)僅僅為了描述,不代表實(shí)施場(chǎng)景的優(yōu)劣。

以上公開(kāi)的僅為本發(fā)明的幾個(gè)具體實(shí)施場(chǎng)景,但是,本發(fā)明并非局限于此,任何本領(lǐng)域的技術(shù)人員能思之的變化都應(yīng)落入本發(fā)明的保護(hù)范圍。

當(dāng)前第1頁(yè)1 2 3 
網(wǎng)友詢問(wèn)留言 已有0條留言
  • 還沒(méi)有人留言評(píng)論。精彩留言會(huì)獲得點(diǎn)贊!
1
泗阳县| 丰台区| 德阳市| 汕尾市| 司法| 巫溪县| 正定县| 梅州市| 黄龙县| 普陀区| 西华县| 岳阳县| 淮阳县| 沿河| 安庆市| 雅安市| 阳谷县| 桐庐县| 汪清县| 双峰县| 华亭县| 临漳县| 双城市| 白沙| 丹江口市| 武夷山市| 长垣县| 锡林郭勒盟| 广州市| 文化| 海安县| 鄂州市| 兴文县| 阿拉尔市| 广饶县| 商城县| 上虞市| 大悟县| 三台县| 温宿县| 兴海县|