索引時資料庫提高資料查詢處理性能的一個非常關鍵的技術,索引的使用可以對性能產生上百倍甚至上千倍的影響,接下來,會介紹索引的基本原理、概念,并深入學習資料庫中所使用的索引結構和存盤方式,以及如何管理、維護索引等,
1.索引的基本概念
索引時用來快速查詢表記錄的一種存盤結構,一般使用索引有一下兩個方面:
- 確定記錄的唯一性[唯一性索引,來保證表中記錄的唯一性要求]
- 提高資料查詢的性能
提高表記錄查詢性能是索引存在的最大有點,在沒有索引的情況下,資料庫優化器需要采用順序掃描的方式
掃描全表來查找目標記錄,
具體做法是:
讀取所有術語該表的資料頁,從表的第一個資料頁開始,順序訪問所有包含該表資料頁的設備,知道最
后一頁為止,回傳滿足條件的所有行,在掃描小表的記錄和需要查詢大表中大多數記錄的情況下,順序燒苗
是一種不錯的選擇,小表只占用很少的資料頁,對于小表的順序燒苗需要的IO非常小,對于大表上進行全表
掃描的情況,如資料倉庫中對系統報表進行查詢統計時,需要利用全表資料進行max、min、avg、sum等包
含聚合函式的查詢,此時整個表的資料都是查詢結果所需要的,這使得順序掃描優于隨機掃描,
性能比較差的時候,如下所述:
順序掃描在OLTP系統中性能太低,OLTP系統的特點是一個事務需要處理的記錄數非常少,但是表中的
記錄量非常大,若在大表中尋找滿足一定條件的少量記錄(比如 <= 5%),么順序掃描需要大量的IO動作,
同時消耗大量的記憶體,把不需要的資料頁填充到記憶體快取區中,影響buffer的使用進而影響整個資料庫的
性能,因此我們不應該使用順序掃描檔方式去訪問隨機的或者非順序存盤的資料,這會導致非常明顯的性
能損失,在這樣的條件下,資料庫通過查詢索引中記錄的行資料所在的物理位置的資訊,就可以快速讀取
滿足條件的少量記錄行,而不影響將整個表記錄都讀取到記憶體中,因此索引可以有效地減少IO,
總結:索引適用于離散資料掃描的場景
有無索引在表關聯中的對比
當量表進行關聯連接且其中一張表很大時,索引也是必要存在的,
分析:
在沒有索引的情況下,兩張表進行關聯時,且套回圈的迭代連接程序將嚴重影響表關聯的性能,此時
需要將第一章表中每條滿足條件的記錄注意與第二張表進行全表記錄匹配,如果第二張表非常大,則全表
掃描的方式將大大影響表關聯的效率,在有索引的情況下,優化器可以通過索引找到目標記錄,大大減少
匹配次數,當然實際的資料庫優化器會對沒有索引的表實施創建Hash索引,采用HashJoin方式進行關聯,
索引概述:
索引是資料庫中的一種結構或者物件,資料庫索引與數或者檔案柜的索引非常像,它以記錄的特征(通常
是一個或多個欄位的值)作為輸入,能夠快速找到該特征的記錄,為查詢提供快速訪問符合條件的資料
行的能力,利用索引進行隨機訪問時,能夠最小化IO,顯著提高性能,資料庫中的索引是一種動態的數
據結構,它會和表中的資料一起改變,在一個表中可以有多個索引,用來滿足不同查詢的需要,
什么情況資料庫優化器可以使用索引對查詢進行加速 ?
1.使用隨機訪問方式代替全表資料的順序訪問時;
2.查詢運算式只有索引列時,可以避免讀取表中的其他資料行;
3.在執行GROUP BY和ORDER BY子句時,避免不必要的排序操作(包括創建臨時表).通常資料庫優
化器決定是否使用索引,當然我們也可以強迫資料庫優化器使用或者避免使用索引,
在執行查詢前,如果恰當地在列上建立了索引,則可以節省上千次、上萬次,在極限情況下甚至節省
了百萬次,但是索引也需要占用空間和資源,來進行額外的處理和索引維護等作業,
2.索引的結構
2.1 B+樹
資料庫常用的索引會有有二叉搜索樹、B樹、B+樹、Hahs、位圖和R樹,其中使用最廣泛的是B+樹,
B+樹可以看做成改進的B樹,在了解B+樹之前,我們來看看B樹的索引結構,B樹把各個存盤快組織成一棵
樹,這個樹總是保持平衡的,即所有葉子節點總局又相同的深度,B樹有是那種節點:根節點、分支節點、
葉子節點,根節點指向多個分支節點,分支節點指向葉子節點,也直接點指向實際的資料行記錄【資料
頁的地址】
深入學習B樹
B樹說明:
B樹的階:節點的最多子節點個數,比如2-3樹的階是3,2-3-4樹的階是4.
B-樹的搜索:從根節點開始,對結點內的關鍵字(有序)序列進行二分查找,如果命中則結束,否則
進入查詢關鍵字所屬范圍的兒子節點;重復;直到所對應的兒子指標為空,或已經是葉子節點,
一棵m階B樹是一棵平衡的m路搜索樹,每個存盤快(節點)存盤m個關鍵字和m+1個指標,它或者是空樹,
或者是滿足一下性質的樹,
根節點至少至少包含兩個孩子節點,即至少有兩個指標被參考,每個指標指向B樹的下一層存盤快,
總是保持資料的有序性,每個存盤塊中的關鍵字按遞增順序排列
無不讀書神仙,有打瞌睡豪杰,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/501299.html
標籤:Java
