一、先導:練習:[31 18 73 9 27 37 99]
上面資料經過一系列插入後:變成了有序的結構
,且符合二叉樹的特性
但是如果是同一組數[9 18 27 31 37 73 99],公升序後再排序:
這種情況出現了嚴重的傾斜
,這是比較極端的情況 ,二叉樹變成線性結構了,查詢效率明顯降低,沒有發揮出二叉樹的優勢。
為了不讓二叉樹出現嚴重傾斜,提出了平衡二叉樹的概念。
2、平衡二叉樹: 特殊的二叉樹
比二叉樹多了乙個特性:
左右2個子樹的高度差的絕對值不會超過1,並且左右2個子樹都是平衡二叉樹。
乙個平衡二叉樹最多能容納:20+ 21+22+…+2h-1,h為高度。
這樣計算100w的資料,高度為20,從有著100w條資料的平衡二叉樹中找乙個資料最多20次,如果是記憶體,效率很高,但是資料庫中的資料基本上是放到磁碟的
,每讀取乙個二叉樹結點就是一次磁碟io
,找一條資料,經過20次磁碟io,效能就很差了。於是考慮把平衡二叉樹壓縮(由高變成胖),即b-樹。
3 、b-樹 :
特性:
我們都知道資料庫的資料是一條條存在的。
思考:資料庫以b-樹資料結構存數資料,資料是如何存放的呢?
把元素部分拆成了key-data形式,key就是主鍵,data就是資料。
4、b+樹:
b+樹是在b-樹基礎上的乙個優化。
特點:
思考2:
b-tree 與二叉查詢樹?
二叉查詢樹查詢的時間複雜度o(logn),查詢速度最快和比較次數最少,既然效能已經如此優秀,為什麼實現索引使用b-tree 而不是二叉查詢樹,主要是因為 磁碟io的次數。
資料庫索引是儲存在磁碟上的,當表中的資料量比較大時,索引的大小也跟著增長,達到幾個g。當我們利用索引進行查詢時,不可能把索引全部載入到記憶體中,只能逐一載入每個磁碟頁,這裡的磁碟頁就對應索引樹的結點。
5、補充知識:
硬碟如何儲存資料:
分類:機械硬碟和固態硬碟
機械硬碟: 裡面裝有兩面都塗有磁性材料的磁碟,在工作時,會不停的旋轉,寫入資料時,會利用磁頭改變磁碟上磁性材料的極性(正負分別對應0和1),而讀取資料時,旁邊的讀取器可以識別磁性材料的不同極性,還原成0或1。
一片磁碟分為若干個磁軌,乙個磁軌分為各個扇區,扇區是磁碟儲存資料的最小資料塊,一般是512位元組。要想讀取某個檔案,必須在電機驅動下,先找到對應的磁軌,再等磁碟轉到對應扇區才行,一般會有十幾秒的延遲,這就導致在讀取分散在磁碟各處的資料時,速度大幅度降低。
機械磁碟如下圖:
磁軌示意圖:
固態硬碟: 基於電路的固態硬碟 ,不會有機械硬碟的延遲,儲存資料靠的是快閃儲存器。在寫入資料時,資料會通過就介面進入主控制器,經處理後,再分配到快閃儲存器中儲存。快閃儲存器的基本儲存單位是浮柵電晶體
固態硬碟:
浮柵電晶體:
二、索引的結構:
b+樹索引:
b+樹索引知識點補充:
1.非主鍵索引:非主鍵索引的葉子節點存的是主鍵索引值,避免維護事務,如果非主鍵索引的葉子節點也儲存data,那麼就會有多份資料,需要保證多份資料的一致性,以及多份資料都會佔磁碟空間。
2.乙個索引就是一顆b+樹
3.聯合索引:例如index(a,b,c),會先按a排序,a相同的情況下,再按b排序,a,b都相同,就按排序。索引盡量遵循最左字首原則,如果是mysql的話,使用b,c作為查詢條件,就不會走索引,oracle11g貌似會走索引,底層做了優化,有待確認
4.儘量減少多個單值索引的使用,多使用聯合索引
5.聚集索引和非聚集索引:
聚集索引:索引和資料(data)放在乙個檔案裡
非聚集索引:索引和資料(data)放在不同的檔案裡,可能涉及回表操作
6.回表:通過非主鍵索引拿到主鍵索引值,再去主鍵索引樹拿資料(data)。盡量避免回表操作,比如使用覆蓋索引(即查詢的字段在非主鍵索引樹中可以拿到)
7.oracle 鎖表後,可以新增資料,但是不能刪除和修改原來的資料,mysql鎖表後是不允許新增資料的
8.mysql排序分為filesort(檔案排序)和索引排序(index sort):
a.file sort:分為單路排序和雙路排序(回表排序),之所有有這2種,是因為sort_buffer大小有限
單路排序:
會根據索引找到所有查詢欄位和排序欄位都放在sort_buffer(預設是1024)中,然後再排序
雙路排序:
根據索引找到查詢資料的行資料的行id和排序字段放在sort_buffer中,然後再根據行id去主鍵索引樹取出所有需要的字段
b.index sort:效率高
二、索引的使用:
建立索引原則:
索引使用條件:
三、索引的分類:
b樹,函式,位圖,反序,反向,分割槽
四、索引的運維:
索引的作用:保證業務的完整性
索引的優點:提高查詢速度
索引的缺點:增加儲存空間,降低dml語句的效率
索引雖然能加快檢索速度,但是在有些情況下,使用索引查詢一樣會很慢,這時候需要分析資料,考慮重建索引
五、各種索引的優缺點:
hash索引:效率高,但是對範圍查詢,模糊查詢不能很好的支援
b+樹索引:能很好的支援範圍查詢和%在後面的模糊查詢(把其當做乙個變數)
六、分析sql的效能工具:
執行計畫:explan
trace工具:
七、常見sql優化:
mysql的表關聯常見的2種演算法:
IT人士不得不看的成長手冊
作為it技術人員,相信沒有乙個人願意永遠在底層編寫程式或做簡單的系統維護。經過一段時間的技術和經驗的積累,很多人都嚮往更高層的職位,但如何能成為乙個專業的it管理人才,並不是每乙個人都清晰 明了。如果你真想成為一名成功 成熟的it專家,你需要不斷地擴充套件你的技能與知識 有些知識領域可能對你很陌生,...
this指向 不得不看的this指向問題
分析this的指向共有四種型別 1 函式被呼叫時 即執行時 才會確定該函式內this的指向。因為在函式中this與arguments是兩個特殊的變數,在函式被呼叫時才會取得它們,而且搜尋這兩個變數時只會在活動物件範圍裡面去搜。2 要確定函式中this的指向,必須先找到該函式被呼叫的位置。認準第一種 ...
IT人士不得不看的保健手冊
專門針對站長生活習性的作息飲食建議 看不起的病 不死的癌症 1 堅持 定時 休息 12點之前 標準睡眠時間8小時 2 養成習慣起床後 喝水 茶 休息後再 吃早餐 雞蛋 稀飯 粥 玉公尺糊 包子 青菜等,建議避免 油炸的 3 飯後百步走 飯後散步 10分鐘左右 4 每小時休息讓眼睛休息幾分鐘 看遠方 ...