查找-->樹-->索引(b樹 hash)-->數(shù)據(jù)庫優(yōu)化-->存儲過程竹握、prepareStatement辆飘、SQL注入

一、查找?

靜態(tài)查找

無序查找:一個個對比O(n)

順序查找:二分查找法蜈项,O(logn)〗某模可通過將查找過程建立二叉判定樹來計算時間復(fù)雜度,查找到一個元素的過程實際上就是從根節(jié)點找到目標(biāo)節(jié)點的過程轴总,比較次數(shù)即為樹的深度,而根據(jù)二叉樹的性質(zhì)际乘,深度為k的二叉樹的結(jié)點總數(shù)為2的k次冪再-1漂佩,所以n各節(jié)點的樹的深度為log(n+1),所以時間復(fù)雜度即為深度O(logn)养葵。

動態(tài)查找

1 ?二叉排序樹/搜索樹

是一棵左結(jié)點比根根節(jié)點小瘩缆,右結(jié)點比根結(jié)點大的樹,遞歸定義庸娱,并允許樹/子樹為空。

時間復(fù)雜度與二叉判定樹算法一樣归露,但上面的深度計算公式是完全二叉樹的情況斤儿,二叉搜索樹在最壞的情況下可能是一棵單鏈的樹,時間復(fù)雜度為O(n)疆液。一般情況下大約占40%多陕贮,時間復(fù)雜度還是O(logn)。所以不穩(wěn)定飘蚯。

2 ?二叉平衡樹

由于二叉排序樹時間復(fù)雜度的不穩(wěn)定福也,就引入了平衡的概念,使左右子樹高度之差保持在1內(nèi)峦甩。插入和刪除樹都需要嚴(yán)格維持平衡狀態(tài)進(jìn)行大量旋轉(zhuǎn)。

?1)紅黑樹:

? ? 紅黑樹是一棵不“完全平衡”的平衡樹凯傲,借助紅黑樹的五個性質(zhì)冰单,能保證其時間復(fù)雜度在O(logn)。

? ? 與平衡二叉樹相比诫欠,其插入時的旋轉(zhuǎn)操作與AVL一樣都能維持在兩個旋轉(zhuǎn)內(nèi),刪除比AVL穩(wěn)定轿偎,紅黑樹能保證在刪除時旋轉(zhuǎn)操作最多三次被廓,而AVL有可能會導(dǎo)致被刪節(jié)點到根節(jié)點都需要旋轉(zhuǎn),O(logn)昆婿。

? ? 5個性質(zhì):a.節(jié)點非黑即紅 b.根節(jié)點是黑色 c.所有Null成為葉子結(jié)點蜓斧,也是黑色 ?d.所有紅節(jié)點的子節(jié)點都是黑色的(不可能兩個紅的相連)e.任一節(jié)點到其葉子結(jié)點的所有路徑上的黑節(jié)點數(shù)量相同,(最短路徑==最長路徑法精,平衡所在)

2)B樹 B+樹

平衡的多路查找樹


二、索引

1.為啥不用平衡二叉樹或紅黑樹狼荞?

索引是為了加快查詢的速度的一種方式帮碰,索引一般都很大,因此不可能將其放在內(nèi)存中丰涉,一般也是放在磁盤上斯碌。所以,在選取索引的數(shù)據(jù)結(jié)構(gòu)時傻唾,要考慮的更多的是訪問磁盤的I/O次數(shù)承耿。

在樹形結(jié)構(gòu)中加袋,我們訪問一個節(jié)點就要做一次I/O操作抱既,即樹的深度就是我們做I/O操作的次數(shù)。而其他的樹都是二叉樹防泵,無形中就限制了樹的高度。所以我們采用m階的B樹(不是m叉樹L褡堋6切稀)實現(xiàn),B樹比一般的二叉樹更加矮胖贱纠,符合我們的要求响蕴。

2.為啥用B+不用B樹?

B樹和B+樹都是很矮胖的樹浦夷。結(jié)構(gòu)上有所不同

1)B樹

B樹滿足幾個性質(zhì):a.每個節(jié)點最多有m個子樹劈狐,b.根節(jié)點最少兩個或為葉子結(jié)點,c.其他節(jié)點最多ceil(m/2)個子樹 d.任何一個節(jié)點都包含一個其0上關(guān)鍵字的數(shù)量肥缔,關(guān)鍵字和和指向子樹的指針(交替),關(guān)鍵字順序排序(搜索樹案耐А)坟岔。e.所有葉子結(jié)點都在同一層上,不帶任何信息炮车。(可用來說明查找失斒菽隆)

B樹的每個節(jié)點包含最少ceil(m/2)個關(guān)鍵字以及指針(數(shù)量一致o),就是他的每個節(jié)點都是包含數(shù)據(jù)信息的扛或,他的所有葉子結(jié)點都沒有信息。

每次查找到一個節(jié)點需要做兩個操作悲伶,(1)去磁盤讀取數(shù)據(jù)(一個節(jié)點上ceil(m/2)) (2)在讀取的幾個數(shù)據(jù)中查找要找的數(shù)據(jù)住涉。由于B樹節(jié)點分支較二叉樹多而矮胖,所以只需要少數(shù)的幾次I/O操作即可花沉。時間復(fù)雜度是O(log以ceil(m/2)為底 N)

2)B+樹

B+樹與B樹有幾個區(qū)別媳握,首先B+ 樹每個節(jié)點上只有關(guān)鍵字,我們可以將它看作索引娩脾,并且含有n個子樹的節(jié)點上有n個關(guān)鍵字打毛。葉子節(jié)點上包含所有信息以及指向含這些信息的指針,并且葉子結(jié)點之間依關(guān)鍵字大小順序鏈接幻枉。

由此我們可以推出展辞,B+樹由于B樹的幾個地方。

????a.B樹每個節(jié)點包含信息多罗珍,占空間大,導(dǎo)致整個索引在磁盤中占的空間會比B+樹的大蘸朋,當(dāng)我們要加載索引進(jìn)內(nèi)存時扣唱,B+樹就能加載的更多(一個盤快上存的更多)团南,一次I/O操作能做更多的查詢炼彪。

????b.由于B+樹的葉子結(jié)點包含全部信息且按順序相連,當(dāng)有范圍查找時拷橘,B+樹就不需要多次讀寫內(nèi)存了喜爷,而B樹要遍歷樹

? ? c.B+樹的查詢更加穩(wěn)定,都是在葉子節(jié)點上术幔,比較次數(shù)每次都一樣湃密。

3 hash索引

hash索引即利用哈希表將key映射在哈希表上,沖突采用鏈地址法勾缭。(like hashmap結(jié)構(gòu) )

所以哈希索引查找速度非沉┯桑快了O(1),但十分局限幻梯,只適用于等值查詢較多,且重復(fù)元素較少的情況(避免沖突 鏈表過長)咬摇。



三煞躬、數(shù)據(jù)庫優(yōu)化

1)數(shù)據(jù)庫設(shè)計方面

建立索引-->在SQL方面就避免使用會使索引失效的語句,比如控制查詢在扰,不等雷客,計算操作等。

盡量使用固定長度的字段(提高性能皱卓,可直接計算出偏移量),

限制字段長度(存放在磁盤中占用空間小娜汁,可一次多讀取一些)存炮,

分區(qū)(將數(shù)據(jù)存儲在不同磁盤蜈漓,查找去對應(yīng)磁盤找,表還是一個表)融虽、主從,分表分庫

2)數(shù)據(jù)庫I/O方面

增加緩沖區(qū)般又、

若涉及表的的級聯(lián)巍佑,將不同的表存儲在不同的磁盤上,以增加I/O速度堕义。(并行讀取嗎脆栋??怕膛?不懂)

3)SQL語句方面

關(guān)聯(lián)時小表為主表秦踪、查詢時篩選多的條件在前,避免select*,需要什么查什么等

限制反悔的條目數(shù)柠逞,使用分頁

4)Java方面

PrepareStatement希坚,預(yù)處理緩存

存儲過程,預(yù)處理裁僧,緩存慕购,速度快沪悲,重復(fù)代碼少(不好維護(hù))



存儲過程的優(yōu)缺點:

優(yōu)點:a.復(fù)雜業(yè)務(wù)邏輯封裝阱表,復(fù)用

? ? ? ? ? ?b.將多條sql訪問數(shù)據(jù)庫的操作合并為一條

? ? ? ? ? ? c.只編譯一次殿如,不需要每次都重新編譯

? ? ? ? ? ? d.可設(shè)置用戶權(quán)限最爬,安全性高

缺點:a.不易調(diào)試 ,難以維護(hù)烤送,難修改

? ? ? ? ? ? b.可移植性差糠悯,不同數(shù)據(jù)庫寫存儲過程語法有不同


PrepareStatement 和 Statement區(qū)別

執(zhí)行靜態(tài)的Sql語句,即完整的語句互艾;prepareStatement可以包含動態(tài)參數(shù)“纫普?”,預(yù)防SQL注入

statement每次都需要編譯執(zhí)行局嘁;prepareStatement會進(jìn)行預(yù)編譯悦昵,將命令放在緩沖區(qū)中,下次執(zhí)行時就不需要在編譯了但指,大大提高效率(jdbc存儲過程)

prepareStatement支持批處理



SQL注入

SQL注入:攻擊者將SQL命令通過表單輸入框或頁面請求查詢字符串插入后臺執(zhí)行SQL中棋凳,欺騙服務(wù)器執(zhí)行惡意SQL命令的(一般使用or 1==1)

防范:a.檢查數(shù)據(jù)變量類型和格式

? ? ? ? ? ?b.過濾特殊符號

? ? ? ? ? ? c.綁定變量,使用預(yù)編譯語句

????????????d.判斷返回數(shù)據(jù)的條數(shù)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末贞滨,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子勺良,更是在濱河造成了極大的恐慌骄噪,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件事甜,死亡現(xiàn)場離奇詭異滔韵,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)跨跨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忱嘹,“玉大人拘悦,你說我怎么就攤上這事〈∶祝” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蘑斧。 經(jīng)常有香客問我,道長沟突,這世上最難降的妖魔是什么捕传? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮职辅,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘条霜。我一直安慰自己涵亏,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布拆内。 她就那樣靜靜地躺著宠默,像睡著了一般。 火紅的嫁衣襯著肌膚如雪抹沪。 梳的紋絲不亂的頭發(fā)上瓤球,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天卦羡,我揣著相機(jī)與錄音噪馏,去河邊找鬼。 笑死绿饵,一個胖子當(dāng)著我的面吹牛欠肾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拟赊,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼刺桃,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了要门?” 一聲冷哼從身側(cè)響起虏肾,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎欢搜,沒想到半個月后封豪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡吹埠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片缘琅。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡粘都,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出刷袍,到底是詐尸還是另有隱情翩隧,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布呻纹,位于F島的核電站堆生,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏雷酪。R本人自食惡果不足惜淑仆,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望哥力。 院中可真熱鬧蔗怠,春花似錦、人聲如沸吩跋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钞澳。三九已至怠惶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間轧粟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工脓魏, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留兰吟,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓茂翔,卻偏偏與公主長得像混蔼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子珊燎,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容