GBase 8t索引

来源:https://www.cnblogs.com/lekuyuan/archive/2022/08/09/16564902.html
-Advertisement-
Play Games

索引時資料庫提高數據查詢處理性能的一個非常關鍵的技術,索引的使用可以對性能產生上百倍甚至上千倍的影響。接下來,會介紹索引的基本原理、概念,並深入學習資料庫中所使用的索引結構和存儲方式,以及如何管理、維護索引等。 1.索引的基本概念 索引時用來快速查詢表記錄的一種存儲結構,一般使用索引有一下兩個方面: ...


索引時資料庫提高數據查詢處理性能的一個非常關鍵的技術,索引的使用可以對性能產生上百倍甚至上千倍的影響。接下來,會介紹索引的基本原理、概念,並深入學習資料庫中所使用的索引結構和存儲方式,以及如何管理、維護索引等。

1.索引的基本概念

索引時用來快速查詢表記錄的一種存儲結構,一般使用索引有一下兩個方面:

  1. 確定記錄的唯一性[唯一性索引,來保證表中記錄的唯一性要求]
  2. 提高數據查詢的性能
提高表記錄查詢性能是索引存在的最大有點,在沒有索引的情況下,資料庫優化器需要採用順序掃描的方式
掃描全表來查找目標記錄。
具體做法是:
	讀取所有術語該表的數據頁,從表的第一個數據頁開始,順序訪問所有包含該表數據頁的設備,知道最
後一頁為止,返回滿足條件的所有行。在掃描小表的記錄和需要查詢大表中大多數記錄的情況下,順序燒苗
是一種不錯的選擇。小表只占用很少的數據頁,對於小表的順序燒苗需要的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樹的下一層存儲快。
	總是保持數據的有序性,每個存儲塊中的關鍵字按遞增順序排列

無不讀書神仙,有打瞌睡豪傑。
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1 同步鎖synchronized追本溯源 引言 提到synchronized,無論是在開發過程中和麵試過程中常常遇到的問題 synchronized;也算是重災區了 為什麼說是重災區? 因為他不像其他的代碼,是有源碼,可以查看的 synchronized是一個關鍵字。直接是找不到源代碼的 接下來 ...
  • 大家好,我是三友,我又來了~~ 最近仍然暢游在RocketMQ的源碼中,這幾天剛好翻到了消費者的源碼,發現RocketMQ的對於push消費方式的實現簡直太聰明瞭,所以趁著我腦子裡還有點印象的時候,趕緊來寫一篇文章,來掰扯一下,防止過兩天就忘得一干二凈了。 MQ消費方式 消費方式就是指消費者如何從M ...
  • .精華筆記: 1)成員內部類: 應用率不高 1.1)類中套類,外面的稱為外部類,裡面的稱為內部類 1.2)內部類通常只服務於外部類,對外不具備可見性 1.3)內部類對象通常在外部類中創建 1.4)內部類中可以直接訪問外部類的成員(包括私有的) 內部類中有一個隱式的引用,指向了創建它的外部類對象 外部 ...
  • Python有一個for...else語法,它的寫法如下 for i in range(0,100): if i == 3: break else: print("Not found") 該語句表示:若for迴圈遍歷完畢,則執行else部分的語句。也就是說上述代碼不會有任何輸出,而下述代碼會輸出“N ...
  • 精華筆記: static final常量:應用率高 必須聲明同時初始化 由類名打點來訪問,不能被改變 建議:常量所有字母都大寫,多個單詞用_分隔 編譯器在編譯時會將常量直接替換為具體的數,效率高 何時用:數據永遠不變,並且經常使用 抽象方法: 由abstract修飾 只有方法的定義,沒有具體的實現( ...
  • 一、實現原理 在Servlet3協議規範中,包含在JAR文件/META-INFO/resources/路徑下的資源可以直接訪問。 二、舉例說明 如下圖所示,是我新建的一個Spring Boot Starter項目:zimug-minitor-threadpool,用於實現可配置、可觀測的線程池。其中 ...
  • 1、我們的目標是獲取微博某博主的全部圖片、視頻 2、拿到網址後 我們先觀察 打開F12 隨著下滑我們發現載入出來了一個叫mymblog的東西,展開響應發現需要的東西就在裡面 3、重點來了!!! 通過觀察發現第二頁比第一頁多了參數since_id 而第二頁的since_id參數剛好在上一頁中能獲取到, ...
  • django2 路由控制器 Route路由,是一種映射關係。路由是把客戶端請求的url路徑和用戶請求的應用程式,這裡意指django裡面的視圖進行綁定映射的一種關係。 請求路徑和視圖函數不是一一對應的關係 在django中所有的路由最終都被保存到一個叫urlpatterns的文件里,並且該文件必須在 ...
一周排行
    -Advertisement-
    Play Games
  • 最近做項目過程中,使用到了海康相機,官方只提供了C/C++的SDK,沒有搜尋到一個合適的封裝了的C#庫,故自己動手,簡單的封裝了一下,方便大家也方便自己使用和二次開發 ...
  • 前言 MediatR 是 .NET 下的一個實現消息傳遞的庫,輕量級、簡潔高效,用於實現進程內的消息傳遞機制。它基於中介者設計模式,支持請求/響應、命令、查詢、通知和事件等多種消息傳遞模式。通過泛型支持,MediatR 可以智能地調度不同類型的消息,非常適合用於領域事件處理。 在本文中,將通過一個簡 ...
  • 前言 今天給大家推薦一個超實用的開源項目《.NET 7 + Vue 許可權管理系統 小白快速上手》,DncZeus的願景就是做一個.NET 領域小白也能上手的簡易、通用的後臺許可權管理模板系統基礎框架。 不管你是技術小白還是技術大佬或者是不懂前端Vue 的新手,這個項目可以快速上手讓我們從0到1,搭建自 ...
  • 第1章:WPF概述 本章目標 瞭解Windows圖形演化 瞭解WPF高級API 瞭解解析度無關性概念 瞭解WPF體繫結構 瞭解WPF 4.5 WPF概述 ​ 歡迎使用 Windows Presentation Foundation (WPF) 桌面指南,這是一個與解析度無關的 UI 框架,使用基於矢 ...
  • 在日常開發中,並不是所有的功能都是用戶可見的,還在一些背後默默支持的程式,這些程式通常以服務的形式出現,統稱為輔助角色服務。今天以一個簡單的小例子,簡述基於.NET開發輔助角色服務的相關內容,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 第3章:佈局 本章目標 理解佈局的原則 理解佈局的過程 理解佈局的容器 掌握各類佈局容器的運用 理解 WPF 中的佈局 WPF 佈局原則 ​ WPF 視窗只能包含單個元素。為在WPF 視窗中放置多個元素並創建更貼近實用的用戶男面,需要在視窗上放置一個容器,然後在這個容器中添加其他元素。造成這一限制的 ...
  • 前言 在平時項目開發中,定時任務調度是一項重要的功能,廣泛應用於後臺作業、計劃任務和自動化腳本等模塊。 FreeScheduler 是一款輕量級且功能強大的定時任務調度庫,它支持臨時的延時任務和重覆迴圈任務(可持久化),能夠按秒、每天/每周/每月固定時間或自定義間隔執行(CRON 表達式)。 此外 ...
  • 目錄Blazor 組件基礎路由導航參數組件參數路由參數生命周期事件狀態更改組件事件 Blazor 組件 基礎 新建一個項目命名為 MyComponents ,項目模板的交互類型選 Auto ,其它保持預設選項: 客戶端組件 (Auto/WebAssembly): 最終解決方案裡面會有兩個項目:伺服器 ...
  • 先看一下效果吧: isChecked = false 的時候的效果 isChecked = true 的時候的效果 然後我們來實現一下這個效果吧 第一步:創建一個空的wpf項目; 第二步:在項目裡面添加一個checkbox <Grid> <CheckBox HorizontalAlignment=" ...
  • 在編寫上位機軟體時,需要經常處理命令拼接與其他設備進行通信,通常對不同的命令封裝成不同的方法,擴展稍許麻煩。 本次擬以特性方式實現,以兼顧維護性與擴展性。 思想: 一種命令對應一個類,其類中的各個屬性對應各個命令段,通過特性的方式,實現其在這包數據命令中的位置、大端或小端及其轉換為對應的目標類型; ...