【文章內(nèi)容簡介】
斷學(xué)習(xí)優(yōu)化的過程?;谝粭l基本思想:最近訪問的表格,在最近一段時間內(nèi),仍處于同一狀態(tài)(忙),即很可能被再次訪問。假如這種判斷出現(xiàn)錯誤,也會僅僅因為一次的查詢操作,而只誤導(dǎo)一次,在下一次同樣的查詢,又會轉(zhuǎn)入正確的優(yōu)化判斷。這樣的“誤判”,僅僅造成一次慢速的查詢,不會有太大的損失。優(yōu)化的另一策略是盡量避免通信代價的開銷,使一個查詢盡量不經(jīng)過查詢中轉(zhuǎn),避免查詢結(jié)果數(shù)據(jù)的通信。(2)優(yōu)化設(shè)計為了記錄上次訪問表的查詢代價,及其通信代價,需要設(shè)計以下一些表格如表31,以記錄如下一些上次訪問的歷史信息:說明:(此處的通信代價不是指一次查詢的所有數(shù)據(jù)的通信代價,是單位數(shù)據(jù)在當(dāng)時的通信代價)節(jié)點IP:指示局域網(wǎng)中分布式數(shù)據(jù)庫所在的節(jié)點的IP地址數(shù)據(jù)庫:指該節(jié)點中存在有哪些數(shù)據(jù)庫關(guān)系表:指該數(shù)據(jù)庫中存在有哪些表用戶數(shù):指該表中當(dāng)時有幾個用戶查詢的計數(shù)為使各節(jié)點便于查詢,該表存在于局域網(wǎng)中每一個節(jié)點中,而且為了提高查詢速度,更快的執(zhí)行優(yōu)化選擇,該表必須常駐內(nèi)存。表中記錄信息隨時更新。全局查詢代價由Mysql數(shù)據(jù)庫系統(tǒng)本身的THD結(jié)構(gòu)獲得。某個表的用戶計數(shù)是通過查詢時鎖表機制而獲得。值得說明的是為什么不能采用共享數(shù)據(jù)結(jié)構(gòu)方式?如果分布式網(wǎng)絡(luò)中各節(jié)點共享一張表,表面上看起來,可以節(jié)省存儲分配,維護單一。實際上,由于該表訪問比較頻繁,特別是查詢用戶量增大的時候更是如此,而為了保證數(shù)據(jù)的一致性,各節(jié)點必須互斥訪問該表,無論采用鎖機制,還是簡單的互斥信號量,都會造成訪問因競爭而等待,致使服務(wù)器處理性能大為降低。因此,它是不符合分布式系統(tǒng)設(shè)計思想的。1)操縱單表的查詢語句一個分布式數(shù)據(jù)庫查詢的執(zhí)行,包括全局處理和本地處理兩個階段,相應(yīng)的查詢代價也包括全局處理代價和局部處理代價兩部分,撇開CPU的開銷,可以一個公式近似簡化為:全局查詢代價二通信代價+本地執(zhí)行代價但基于前面的考慮,不計通信代價,所以只有本地執(zhí)行代價。本地執(zhí)行代價=CPU計算時間+I/O等待時間由于CPU計算時間相對很小,可以忽略,執(zhí)行代價近似等于I/O等待時間。實現(xiàn)中,統(tǒng)計的代價為:I/O數(shù)據(jù)量可以粗略的以一個表的所有元組數(shù)計。2)操縱多表的查詢語句需要注意的是,如果一條查詢語句需要操縱不只一個數(shù)據(jù)庫的一個表時,到底以哪個表的代價為準(zhǔn),或者都考慮但多個表之間考慮的偏重程度可能不一樣,并不平均對待。所以衡量多個表操縱的查詢代價,不能簡單的將多個表代價相加之和作為該查詢語句的代價。統(tǒng)計操縱多表的查詢語句的代價時,很難將總體代價定位在各個表上,一些繁瑣的算法既費時,又不準(zhǔn)確,所以,基于實際應(yīng)用上的考慮,略去本次查詢的代價統(tǒng)計,而只統(tǒng)計單表操作的代價。多表屬于同一數(shù)據(jù)庫(對庫級分布,一定位于同一結(jié)點上),理論上,任選其中一個表的代價來衡量,但在實際操作中,為了減少單個表帶來的偶然誤判,采用累加和。多表不屬于同一數(shù)據(jù)庫(不一定位于同一結(jié)點上),此種情況,當(dāng)然不能像上面一樣,任選一個表的代價去衡量,也不能將各表的代價累加之和作為痕量的代價。只能根據(jù)哪個表的操作代價高來決定執(zhí)行節(jié)點。但對庫級分布的數(shù)據(jù)庫不支持多表不屬于一個數(shù)據(jù)庫的情況。這里討論的負載主要指用戶數(shù)量,以表作資源對象,用在某個表上的等待的線程(用戶數(shù))來度量負載。計數(shù)策略:由于多個查詢可能操縱同一表,為保證數(shù)據(jù)的一致性,本分布式數(shù)據(jù)庫系統(tǒng)提供了互斥鎖(讀鎖和寫鎖)機制。當(dāng)一個操縱某個表的查詢請求到來時,就將count計數(shù)作加1操作,當(dāng)該表的一個操作結(jié)束。當(dāng)解鎖一次,就將count計數(shù)作減I操作。然后定期更新此。ount計數(shù)。為此,需要在THD的結(jié)構(gòu)里定義一個變量以保存該計數(shù)值。對代價的統(tǒng)計,取一定時間內(nèi),每次查詢的代價的平均值。這里的一定時間即為統(tǒng)計周期,也是更新周期。同樣,將每次查詢的代價記入THD結(jié)構(gòu)里,也將代價的平均值保存到THD結(jié)構(gòu)里。以便全局優(yōu)化器能方便獲取所需信息。采用動態(tài)更新,即服務(wù)器一啟動便開始統(tǒng)計,在服務(wù)器運行過程中周期性更新。所以全局代價表從無到有,逐漸增多,隨著時間的推移,使查詢優(yōu)化信息越來越完善,越來越準(zhǔn)確。另外,如果本次查詢的表在全局代價表里尚未存在記錄,則該次查詢代價立即記入全局代價表中,以被后來的查詢參考。不必等到一定周期的統(tǒng)計。某一次的統(tǒng)計可能不是準(zhǔn)確的,但多次大量的統(tǒng)計,正確率總是符合正態(tài)分布的,從統(tǒng)計學(xué)的角度講,是正確的、實用的。另外,為了使統(tǒng)計更為真實和有效,本設(shè)計對一些很少出現(xiàn)的一些語句拋棄掉,不予統(tǒng)計。比如像CREATE DATABASE, DROP DATABASE, CREATE TABLEDROP TABLE, ALTER TABLE, CREATE INDEX, DROP INDEX,等只有再創(chuàng)建數(shù)據(jù)庫時,才會用到的一些命令語句。還有一些顯示數(shù)據(jù)庫及其分布信息的查詢命令,以及全局視圖查詢命令,由于較少使用或不涉及具體操縱哪個表,也不予統(tǒng)計其代價信息,如SHOW DATABASE, SHOW TABLES, SHOW GLOBALDBS,SHOW IPSBYDB等。周期如何確定呢?周期過短可能造成統(tǒng)計的平均值不真實。但周期過長,有可能不能反應(yīng)當(dāng)時或最近的服務(wù)器節(jié)點的處理情況。所以周期既不能過長也不能過短,如何確定一個合適的周期呢?首先,這個周期不能是固定不變的,因為網(wǎng)絡(luò)情況不是固定不變的,它會隨著服務(wù)器節(jié)點負載而變化,而服務(wù)器節(jié)點的負載情況完全是隨機的,隨著用戶數(shù)量的變化而變化。因此,為了適應(yīng)變化多端的網(wǎng)絡(luò)環(huán)境及節(jié)點資源負載