本發(fā)明屬于smartrack數(shù)據(jù)庫領(lǐng)域,具體涉及一種smartrack系統(tǒng)數(shù)據(jù)庫的優(yōu)化方法。
背景技術(shù):
數(shù)據(jù)庫是一個單位或是一個應(yīng)用領(lǐng)域的通用數(shù)據(jù)處理系統(tǒng),它存儲的是屬于企業(yè)和事業(yè)部門、團體和個人的有關(guān)數(shù)據(jù)的集合。數(shù)據(jù)庫中的數(shù)據(jù)是為眾多用戶所共享其信息而建立的,已經(jīng)擺脫了具體程序的限制和制約。不同的用戶可以按各自的用法使用數(shù)據(jù)庫中的數(shù)據(jù);多個用戶可以同時共享數(shù)據(jù)庫中的數(shù)據(jù)資源,即不同的用戶可以同時存取數(shù)據(jù)庫中的同一個數(shù)據(jù)。數(shù)據(jù)共享性不僅滿足了各用戶對信息內(nèi)容的要求,同時也滿足了各用戶之間信息通信的要求。
smartrack以標(biāo)準(zhǔn)機柜為設(shè)計單位,統(tǒng)一對其搭載的服務(wù)器節(jié)點進行供電、散熱和管理,廣泛應(yīng)用于大數(shù)據(jù)云計算等領(lǐng)域,需要經(jīng)常應(yīng)對來自互聯(lián)網(wǎng)端大量的數(shù)據(jù)索引,例如12306網(wǎng)站在高峰期面對數(shù)以億計的訪問,經(jīng)常造成網(wǎng)絡(luò)阻塞,網(wǎng)站崩潰等宕機現(xiàn)象時有發(fā)生。此為現(xiàn)有技術(shù)的不足之處。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的在于,針對上述現(xiàn)有技術(shù)存在的缺陷,提供設(shè)計一種smartrack系統(tǒng)數(shù)據(jù)庫的優(yōu)化方法,以解決上述技術(shù)問題。
為實現(xiàn)上述目的,本發(fā)明給出以下技術(shù)方案:
一種smartrack系統(tǒng)數(shù)據(jù)庫的優(yōu)化方法,其特征在于,包括以下步驟:
步驟1):降低數(shù)據(jù)訪問量;
步驟2):降低返回的數(shù)據(jù)量;
步驟3):減少交互次數(shù);
步驟4):降低數(shù)據(jù)庫服務(wù)器cpu運算量。
作為優(yōu)選,所述的步驟1中包含以下步驟:
步驟1.1):創(chuàng)建并使用正確的索引;在數(shù)據(jù)庫中查看數(shù)據(jù)庫真實的執(zhí)行計劃;根據(jù)真實的執(zhí)行計劃確定索引知否正確使用;
步驟1.2):僅通過索引訪問數(shù)據(jù)
只是訪問表中的幾個字段,并且字段內(nèi)容較少,可以為這幾個字段單獨建立一個組合索引,這樣就可以直接只通過訪問索引就能得到數(shù)據(jù),一般索引占用的磁盤空間比表小很多,所以這種方式可以大大減少磁盤io開銷。
步驟1.3):優(yōu)化數(shù)據(jù)庫執(zhí)行計劃
數(shù)據(jù)庫執(zhí)行計劃是關(guān)系型數(shù)據(jù)庫最核心的技術(shù)之一,它表示數(shù)據(jù)庫執(zhí)行時的數(shù)據(jù)訪問算法。由于業(yè)務(wù)需求越來越復(fù)雜,表數(shù)據(jù)量也越來越大,數(shù)據(jù)庫也需要支持非常復(fù)雜的業(yè)務(wù)邏輯,但數(shù)據(jù)庫的性能還需要提高,因此,優(yōu)秀的關(guān)系型數(shù)據(jù)庫除了需要支持復(fù)雜的數(shù)據(jù)庫語法及更多函數(shù)外,還需要有優(yōu)秀的算法庫來提高數(shù)據(jù)庫性能。
步驟2.1):數(shù)據(jù)分頁處理,并具體包含以下步驟:
客戶端(應(yīng)用程序或瀏覽器)分頁,將數(shù)據(jù)從應(yīng)用服務(wù)器全部下載到本地應(yīng)用程序或瀏覽器,在應(yīng)用程序或瀏覽器內(nèi)部通過本地代碼進行分頁處理,該方法編碼簡單,可以減少客戶端與應(yīng)用服務(wù)器網(wǎng)絡(luò)交互次數(shù);
應(yīng)用服務(wù)器分頁,將數(shù)據(jù)從數(shù)據(jù)庫服務(wù)器全部下載到應(yīng)用服務(wù)器,在應(yīng)用服務(wù)器內(nèi)部再進行數(shù)據(jù)篩選。優(yōu)點是編碼簡單,只需要一次數(shù)據(jù)庫交互,總數(shù)據(jù)與分頁數(shù)據(jù)差不多時性能較好;
數(shù)據(jù)庫分頁,采用數(shù)據(jù)庫分頁需要兩次數(shù)據(jù)庫完成
步驟2.2):只返回需要的字段
通過去除不必要的返回字段可以提高性能,如果你的查詢表中有大字段或內(nèi)容較多的字段,如備注信息、文件內(nèi)容等等,那在查詢表時一定要注意這方面的問題,否則可能會帶來嚴(yán)重的性能問題;如果表經(jīng)常要查詢并且請求大內(nèi)容字段的概率很低,我們可以采用分表處理,將一個大表分拆成兩個一對一的關(guān)系表,將不常用的大內(nèi)容字段放在一張單獨的表中。
步驟3.1):采用batchdml
數(shù)據(jù)庫訪問框架一般都提供了批量提交的接口,采用batch操作一般不會減少很多數(shù)據(jù)庫服務(wù)器的物理io,但是會大大減少客戶端與服務(wù)端的交互次數(shù),從而減少了多次發(fā)起的網(wǎng)絡(luò)延時開銷,同時也會降低數(shù)據(jù)庫的cpu開銷;
步驟3.2):采用inlist查詢
很多時候需要按一些id查詢數(shù)據(jù)庫記錄,我們可以采用一個id一個請求發(fā)給數(shù)據(jù)庫,通過這樣處理可以大大減少數(shù)據(jù)庫請求的數(shù)量,從而提高性能;評估在in里面一次放多少個值還需要考慮應(yīng)用服務(wù)器本地內(nèi)存的開銷,有并發(fā)訪問時要計算本地數(shù)據(jù)使用周期內(nèi)的并發(fā)上限;
步驟3.3):設(shè)置fetchsize
當(dāng)采用select從數(shù)據(jù)庫查詢數(shù)據(jù)時,數(shù)據(jù)默認是根據(jù)客戶端fetch_size參數(shù)處理,每次只返回fetch_size條記錄,當(dāng)客戶端游標(biāo)遍歷到尾部時再從服務(wù)端取數(shù)據(jù),直到最后全部傳送完成。所以如果我們要從服務(wù)端一次取大量數(shù)據(jù)時,可以加大fetch_size,這樣可以減少結(jié)果數(shù)據(jù)傳輸?shù)慕换ゴ螖?shù)及服務(wù)器數(shù)據(jù)準(zhǔn)備時間,提高性能。
步驟3.4):使用存儲過程
大型數(shù)據(jù)庫一般都支持存儲過程,合理的利用存儲過程也可以提高系統(tǒng)性能,采用存儲過程可以將整個業(yè)務(wù)邏輯封裝在存儲過程里,然后在客戶端直接調(diào)用存儲過程處理,這樣可以減少網(wǎng)絡(luò)交互的成本。
步驟4.1):使用綁定變量
綁定變量是指數(shù)據(jù)庫中對變化的值采用變量參數(shù)的形式提交,使用綁定變量為何會提高數(shù)據(jù)庫解析性能,這個需要從數(shù)據(jù)庫執(zhí)行原理說明,當(dāng)一條數(shù)據(jù)庫發(fā)送給數(shù)據(jù)庫服務(wù)器后,系統(tǒng)首先會將數(shù)據(jù)庫字符串進行hash運算,得到hash值后再從服務(wù)器內(nèi)存里的數(shù)據(jù)庫緩存區(qū)中進行檢索,如果有相同的數(shù)據(jù)庫字符,并且確認是同一邏輯的數(shù)據(jù)庫語句,則從共享池緩存中取出數(shù)據(jù)庫對應(yīng)的執(zhí)行計劃,根據(jù)執(zhí)行計劃讀取數(shù)據(jù)并返回結(jié)果給客戶端;
):合理使用排序
當(dāng)記錄集增加到上萬條以上時,大記錄集排序不僅增加了cpu開銷,而且可能會由于內(nèi)存不足發(fā)生硬盤排序的現(xiàn)象,當(dāng)發(fā)生硬盤排序時性能會急劇下降。
):減少比較操作
數(shù)據(jù)庫的業(yè)務(wù)邏輯經(jīng)常會包含一些比較操作,對于這些比較操作數(shù)據(jù)庫都體現(xiàn)得很好,like模糊查詢對于數(shù)據(jù)庫來說不是很擅長,特別是需要模糊檢查的記錄有上萬條以上時,這種情況一般可以采用專用search或者采用全文索引方案來提高性能
步驟4.4):復(fù)雜運算由客戶端處理
大量這類復(fù)雜函數(shù)運算,放在客戶端處理,一般cpu每秒中也只能處理1萬-10萬次這樣的函數(shù)運算,放在數(shù)據(jù)庫內(nèi)不利于高并發(fā)處理。
本發(fā)明的有益效果在于,通過本發(fā)明給出的技術(shù)方案,能夠快速定位能性的瓶頸點,快速找到數(shù)據(jù)庫主要的開銷位置,從而快速找到數(shù)據(jù)庫的性能瓶頸點并進行處理,以提高整個數(shù)據(jù)庫的運行效率。此外,本發(fā)明設(shè)計原理可靠,結(jié)構(gòu)簡單,具有非常廣泛的應(yīng)用前景。
由此可見,本發(fā)明與現(xiàn)有技術(shù)相比,具有突出的實質(zhì)性特點和顯著地進步,其實施的有益效果也是顯而易見的。
具體實施方式
下面通過具體實施例對本發(fā)明進行詳細闡述,以下實施例是對本發(fā)明的解釋,而本發(fā)明并不局限于以下實施方式。
本發(fā)明給出以下實施例:
一種smartrack系統(tǒng)數(shù)據(jù)庫的優(yōu)化方法,其特征在于,包括以下步驟:
步驟1):降低數(shù)據(jù)訪問量;
步驟2):降低返回的數(shù)據(jù)量;
步驟3):減少交互次數(shù);
步驟4):降低數(shù)據(jù)庫服務(wù)器cpu運算量。
作為優(yōu)選,所述的步驟1中包含以下步驟:
步驟1.1):創(chuàng)建并使用正確的索引;在數(shù)據(jù)庫中查看數(shù)據(jù)庫真實的執(zhí)行計劃;根據(jù)真實的執(zhí)行計劃確定索引知否正確使用;
步驟1.2):僅通過索引訪問數(shù)據(jù)
只是訪問表中的幾個字段,并且字段內(nèi)容較少,可以為這幾個字段單獨建立一個組合索引,這樣就可以直接只通過訪問索引就能得到數(shù)據(jù),一般索引占用的磁盤空間比表小很多,所以這種方式可以大大減少磁盤io開銷。
步驟1.3):優(yōu)化數(shù)據(jù)庫執(zhí)行計劃
數(shù)據(jù)庫執(zhí)行計劃是關(guān)系型數(shù)據(jù)庫最核心的技術(shù)之一,它表示數(shù)據(jù)庫執(zhí)行時的數(shù)據(jù)訪問算法。由于業(yè)務(wù)需求越來越復(fù)雜,表數(shù)據(jù)量也越來越大,數(shù)據(jù)庫也需要支持非常復(fù)雜的業(yè)務(wù)邏輯,但數(shù)據(jù)庫的性能還需要提高,因此,優(yōu)秀的關(guān)系型數(shù)據(jù)庫除了需要支持復(fù)雜的數(shù)據(jù)庫語法及更多函數(shù)外,還需要有優(yōu)秀的算法庫來提高數(shù)據(jù)庫性能。
本實施例中,所述的步驟2)包含以下步驟:
步驟2.1):數(shù)據(jù)分頁處理,并具體包含以下步驟:
客戶端(應(yīng)用程序或瀏覽器)分頁,將數(shù)據(jù)從應(yīng)用服務(wù)器全部下載到本地應(yīng)用程序或瀏覽器,在應(yīng)用程序或瀏覽器內(nèi)部通過本地代碼進行分頁處理,該方法編碼簡單,可以減少客戶端與應(yīng)用服務(wù)器網(wǎng)絡(luò)交互次數(shù);
應(yīng)用服務(wù)器分頁,將數(shù)據(jù)從數(shù)據(jù)庫服務(wù)器全部下載到應(yīng)用服務(wù)器,在應(yīng)用服務(wù)器內(nèi)部再進行數(shù)據(jù)篩選。優(yōu)點是編碼簡單,只需要一次數(shù)據(jù)庫交互,總數(shù)據(jù)與分頁數(shù)據(jù)差不多時性能較好;
數(shù)據(jù)庫分頁,采用數(shù)據(jù)庫分頁需要兩次數(shù)據(jù)庫完成;
步驟2.2):只返回需要的字段
通過去除不必要的返回字段可以提高性能,如果你的查詢表中有大字段或內(nèi)容較多的字段,如備注信息、文件內(nèi)容等等,那在查詢表時一定要注意這方面的問題,否則可能會帶來嚴(yán)重的性能問題;如果表經(jīng)常要查詢并且請求大內(nèi)容字段的概率很低,我們可以采用分表處理,將一個大表分拆成兩個一對一的關(guān)系表,將不常用的大內(nèi)容字段放在一張單獨的表中。
所述步驟3)包含以下具體步驟:
步驟3.1):采用batchdml
數(shù)據(jù)庫訪問框架一般都提供了批量提交的接口,采用batch操作一般不會減少很多數(shù)據(jù)庫服務(wù)器的物理io,但是會大大減少客戶端與服務(wù)端的交互次數(shù),從而減少了多次發(fā)起的網(wǎng)絡(luò)延時開銷,同時也會降低數(shù)據(jù)庫的cpu開銷;
步驟3.2):采用inlist查詢
很多時候需要按一些id查詢數(shù)據(jù)庫記錄,我們可以采用一個id一個請求發(fā)給數(shù)據(jù)庫,通過這樣處理可以大大減少數(shù)據(jù)庫請求的數(shù)量,從而提高性能;評估在in里面一次放多少個值還需要考慮應(yīng)用服務(wù)器本地內(nèi)存的開銷,有并發(fā)訪問時要計算本地數(shù)據(jù)使用周期內(nèi)的并發(fā)上限;
步驟3.3):設(shè)置fetchsize
當(dāng)采用select從數(shù)據(jù)庫查詢數(shù)據(jù)時,數(shù)據(jù)默認是根據(jù)客戶端fetch_size參數(shù)處理,每次只返回fetch_size條記錄,當(dāng)客戶端游標(biāo)遍歷到尾部時再從服務(wù)端取數(shù)據(jù),直到最后全部傳送完成。所以如果我們要從服務(wù)端一次取大量數(shù)據(jù)時,可以加大fetch_size,這樣可以減少結(jié)果數(shù)據(jù)傳輸?shù)慕换ゴ螖?shù)及服務(wù)器數(shù)據(jù)準(zhǔn)備時間,提高性能。
步驟3.4):使用存儲過程
大型數(shù)據(jù)庫一般都支持存儲過程,合理的利用存儲過程也可以提高系統(tǒng)性能,采用存儲過程可以將整個業(yè)務(wù)邏輯封裝在存儲過程里,然后在客戶端直接調(diào)用存儲過程處理,這樣可以減少網(wǎng)絡(luò)交互的成本。
所述的步驟4)具體包含以下步驟:
步驟4.1):使用綁定變量
綁定變量是指數(shù)據(jù)庫中對變化的值采用變量參數(shù)的形式提交,使用綁定變量為何會提高數(shù)據(jù)庫解析性能,這個需要從數(shù)據(jù)庫執(zhí)行原理說明,當(dāng)一條數(shù)據(jù)庫發(fā)送給數(shù)據(jù)庫服務(wù)器后,系統(tǒng)首先會將數(shù)據(jù)庫字符串進行hash運算,得到hash值后再從服務(wù)器內(nèi)存里的數(shù)據(jù)庫緩存區(qū)中進行檢索,如果有相同的數(shù)據(jù)庫字符,并且確認是同一邏輯的數(shù)據(jù)庫語句,則從共享池緩存中取出數(shù)據(jù)庫對應(yīng)的執(zhí)行計劃,根據(jù)執(zhí)行計劃讀取數(shù)據(jù)并返回結(jié)果給客戶端;
步驟4.2):合理使用排序
當(dāng)記錄集增加到上萬條以上時,大記錄集排序不僅增加了cpu開銷,而且可能會由于內(nèi)存不足發(fā)生硬盤排序的現(xiàn)象,當(dāng)發(fā)生硬盤排序時性能會急劇下降。
步驟4.3):減少比較操作
數(shù)據(jù)庫的業(yè)務(wù)邏輯經(jīng)常會包含一些比較操作,對于這些比較操作數(shù)據(jù)庫都體現(xiàn)得很好,like模糊查詢對于數(shù)據(jù)庫來說不是很擅長,特別是需要模糊檢查的記錄有上萬條以上時,這種情況一般可以采用專用search或者采用全文索引方案來提高性能。
步驟4.4):復(fù)雜運算由客戶端處理
大量這類復(fù)雜函數(shù)運算,放在客戶端處理,一般cpu每秒中也只能處理1萬-10萬次這樣的函數(shù)運算,放在數(shù)據(jù)庫內(nèi)不利于高并發(fā)處理。
以上公開的僅為本發(fā)明的優(yōu)選實施方式,但本發(fā)明并非局限于此,任何本領(lǐng)域的技術(shù)人員能思之的沒有創(chuàng)造性的變化,以及在不脫離本發(fā)明原理前提下所作的若干改進和潤飾,都應(yīng)落在本發(fā)明的保護范圍內(nèi)。