【MySQL】MySQL索引—B樹/B+樹

目錄

1. 數據庫索引

1.1 索引的概念

1.2 索引的特點

1.3 索引查詢對比普通的查詢

1.4 索引的操作

?1.5 索引的原理

?1.6 B樹

1.7 B+樹?

1.8 B+樹的優點


1. 數據庫索引

1.1 索引的概念

數據庫的索引是一種特殊的數據結構,里面包含著數據表中所有記錄的引用,可以對表中一列或者多列創建索引并指定類型

可以將數據庫的索引想象為書的目錄,可以幫助數據庫系統快速定位和訪問表中的特定數據,而不必掃描整個表。


1.2 索引的特點

  • 通過索引可以直接定位數據,不需要逐個掃描數據表中的記錄,可以提高數據庫的查詢性能
  • 數據表在進行插入/更新/刪除操作時,因為要更新索引,導致效率降低
  • 由于索引需要單獨存儲,需要引入額外的存儲開銷
  • 一般建議高頻的查詢建立索引(如:根據用戶名—密碼)
  • 在實際的工作中,查詢使用的頻率遠遠高于數據的增加/刪除/修改

1.3 索引查詢對比普通的查詢

普通select查詢

  1. 需要遍歷整個表
  2. 將遍歷的當前行帶入條件中,看條件是否成立
  3. 如果條件成立,則將這一行保留,不成立則會跳過

索引查詢

  1. 不需要遍歷整個表
  2. 只需要讀取索引頁和少量的數據頁
  3. 并通過索引數據結構(B+樹)快速定位數據

?索引屬于針對查詢操作進行的優化手段,可以通過索引來加快查詢的速度,由于數據存儲在硬盤中,如果每次插敘都訪問硬盤,數據從硬盤中加載進入內存,進行對比,這一系列操作開銷雖然不大,但是數據量如果非常多的話,則會導致開銷很大,所以引入索引是很有必要的


1.4 索引的操作

(1)查看索引

show index from 表名;

(2)創建索引

create index 索引名 on 表名(字段名);

(3)刪除索引

drop index 索引名 on 表名;

注意:

  • 一個索引是針對一個列來指定的,只有這一列進行查詢的時候,查詢速度才會被優化
  • 一個表中可以存在多個索引
  • 創建索引一般在創建表的時候就需要規定好索引
  • 如果現有的數據很多,整個時候如果增加一個索引,很有可能會造成數據庫的崩潰

?1.5 索引的原理

  • 索引的實現肯定是依靠數據結構,但是我們平常使用的數據結構,并不適合
  • 順序表:適合通過下表訪問和尾插
  • 鏈表:適合中間插入和刪除,不適合查詢
  • 棧/隊列/堆:這些更不適合
  • 二叉搜索樹: 由于平衡性問題,查詢效率會降低(不穩定),硬盤數據的存儲效率低,查詢效率低
  • 哈希表:只適合點到點的精準查詢,不能進行范圍查詢和模糊查詢
  • 紅黑樹:雖然可以精準查詢和模糊查詢,但是由于樹的高度較高,查詢訪問的IO訪問次數會變多

由于常見的這些數據結構,都不適合數據庫操作,故引入了新的數據結構—B+樹(N叉搜索樹)

?1.6 B樹


在了解B+樹之前,先了解B樹

類似于這樣的結構,就是B樹

  • 節點內部Key按順序排列,自動保持樹的高度平衡,所有葉子節點位于同一層,每個節點可以有多個子節點
  • 每一個節點可以存在多個Key?,但是也不是無限存儲,到達一定的規模會觸發節點的分裂,刪除元素到達一定的數據也會觸發合并
  • 一個節點上保存N個key值就可以劃分出N+1個區間,每個區間都可以衍生出一系列的子樹
  • 像這些節點,都存儲在硬盤的一塊區域中,一次讀取節點,意味著讀取出多個Key,再進行幾次比較,就可以快速找到自己想要的數值

1.7 B+樹?

  • 所有的數據都保存在葉子節點中,除葉子結點外的節點,不保存數據,只是用來索引
  • 節點中,最右邊為最大值(根節點中,最右邊為整個元素中的最大值)
  • 無論增加或刪除什么元素,都需要保證根節點的最右邊是最大元素
  • 每一個父節點元素都出現在子節點中,是子節點最大(或最小)元素。

?在進行查詢的時候,從根節點觸發,判定要查詢的數據,在節點的那個區間,決定往哪里走,葉子節點之間,通過雙鏈表進行連接,方便數據集合之間按照范圍進行查詢,也可以快速進行刪除和增加等操作


1.8 B+樹的優點

相比于B樹,紅黑樹來說

  • N叉搜索樹,樹的高度有限,降低了IO訪問次數
  • 由于葉子節點之間的鏈表結構,方便增加和刪除操作
  • 所有葉子節點之間屬于有序鏈表,方便范圍查詢。
  • 由于葉子節點存放數據,查詢開銷非常的穩定(穩定性好)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/917524.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/917524.shtml
英文地址,請注明出處:http://en.pswp.cn/news/917524.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

jQuery Mobile 面板詳解

jQuery Mobile 面板詳解 引言 隨著移動設備的普及,移動網頁開發變得越來越重要。jQuery Mobile 是一個基于 jQuery 的移動網頁開發框架,它提供了一套豐富的 UI 組件和主題,使得開發者可以快速構建出美觀、響應式的移動網頁。在 jQuery Mobile 中,面板(Panel)是一個非常…

Python中的import和from...import有什么區別?

文章目錄 前言 一、import導入模塊 導入模塊并給它一個別名 語法格式 二、from...import導入特定項 1.導入模塊中的特定項 2.導入模塊中的所有項 2.1 命名空間核污染 2.2 性能影響 總結 前言 在Python編程中,模塊和包的導入機制是編寫可維護、可擴展代碼的核心。深入理解Pyth…

vscode提示“無法使用 compilerPath 解析配置”解決辦法

0 問題描述 使用vscode的Remote-SSH插件連接安裝在虛擬機上的Windows10進行遠程開發時,出現如下提示:無法使用 compilerPath 解析配置:“D:\mingw64\bin\gcc.exe” 所有包含C庫頭文件的文件都被標紅提示錯誤:1 問題原因 vscode沒有設置正確的…

信噪比(Signal-to-Noise Ratio, SNR)詳細介紹

信噪比(Signal-to-Noise Ratio, SNR)信噪比(Signal-to-Noise Ratio,SNR)是衡量信號質量的重要參數,表示有用信號的功率與背景噪聲功率的比值。SNR在通信、音頻處理、視頻處理以及其他電子信號處理領域中具有…

Nginx 相關實驗(1)

nginx源碼編譯 本實驗采用nginx源碼編譯的安裝方式,需要準備一個tar包,可從nginx官網上下載。 下載地址:nginx: downloadhttps://nginx.org/en/download.html 將下載好的壓縮包傳到虛擬機中的自定義目錄下 [rootwebserver ~]# ls anacond…

【選型】HK32L088 與 STM32F0/L0 系列 MCU 參數對比與選型建議(ST 原廠 vs 國產芯片)(單片機選型主要考慮的參數與因素)

國產 vs ST 單片機在工業控制中的性能對比分析 HK32L088 與 STM32F0/L0 系列 MCU 參數對比與選型建議 工業控制領域 MCU 選型:國產航順 HK32 與 ST 原廠芯片深入比較 國產 MCU 是否可替代 ST?基于發電機控制應用的深入評估 從數據手冊看 MCU 制造工藝差異:HK32L088 vs S…

LLM Prompt與開源模型資源(1)提示詞工程介紹

學習材料:https://www.hiascend.com/developer/courses/detail/1935520434893606913學習時長: 預計 30 分鐘學習目的: 了解提示工程的定義與作用 熟悉提示工程的關鍵技術相關概念 掌握基于昇騰適配的大模型提示工程的入門及進階指南 提示…

kafka與其他消息隊列(如 RabbitMQ, ActiveMQ)相比,有什么優缺點?

Kafka、RabbitMQ 和 ActiveMQ 是三種最主流的消息中間件,它們的設計和適用場景有所不同。 我們可以通過一個簡單的表格來快速了解它們的核心區別: 核心對比一覽特性 / 維度KafkaRabbitMQActiveMQ核心模型分布式、持久化的日志系統 (Dumb Broker / Smart …

Kubernetes架構和部署

k8s組件 master節點:管理節點 管理平面組件 api server : api gateway controller manager scheduler etcd 數據庫 worker節點:被管理節點,運行容器 kubelet:k8s agent container runtime:docker,containerd,cri-o kube-proxy:service 網絡 ????????…

建造者模式及優化

建造者模式是一種創建型設計模式,它將復雜對象的構建過程與表示分離,使得同樣的構建過程可以創建不同的表示。核心思想是指揮者定流程,建造者填細節,通過多個步驟逐步構建對象,并允許靈活組合這些步驟以生成不同配置的…

【09】C++實戰篇——C++ 生成靜態庫.lib 及 C++調用lib,及實際項目中的使用技巧

文章目錄1 C 靜態庫.lib 生成1.1 靜態庫lib的生成方法和使用方法1.2 創建靜態庫項目1.3 編寫.h 和 .cpp文件1.4 設置 及 生成 DLL2 調用 C 靜態庫lib2.1 新建LIBtest及測試代碼2.2 靜態庫配置 及代碼調用測試3 實際項目中的使用技巧、及通用設置3.1 設置lib輸出路徑3.2 設置頭文…

飛算JavaAI:從寫不出代碼到絲滑開發,飛算JavaAI把小白從編程深淵撈進了正軌---它都讓我懷疑自己是不是多余的!

開篇介紹 對于很多初學者來說,編程是一項既有趣又充滿挑戰的任務。面對復雜的代碼和繁瑣的開發流程,常常會感到無從下手。不過,現在有了飛算JavaAI,這一切都將變得簡單起來。 它有啥實用功能呢? 比如: …

關于tresos Studio(EB)的MCAL配置之GtmCfg

Generic Time Module通用時鐘模塊GeneralGtmCfg_DevErrorDetect開發者錯誤檢測開關GtmCfg_DemErrorReporting診斷錯誤報告開關GtmCfg_VersionInfoApi獲取版本信息的接口開關GtmCfg_ConfigSetClockManagementUnitGlobal_Clock_Control_Numerator全局時鐘分頻器的分子Global_Cloc…

深入探索Weaviate:構建高效AI應用的數據庫解決方案

在當今數據驅動的世界中,高效地存儲、檢索和處理大規模數據成為了AI應用開發的關鍵挑戰。Weaviate作為一個開源的向量搜索引擎,憑借其強大的功能和靈活的架構,正逐漸成為開發者構建智能AI應用的首選工具。本文將深入探討Weaviate的核心概念、…

【開源】一款開源、跨平臺的.NET WPF 通用權限開發框架 (ABP) ,功能全面、界面美觀

文章目錄一、開源地址二、框架介紹三、技術路線四、適用場景五、功能模塊六、框架演示截圖一、開源地址 Gihub地址: https://github.com/HenJigg/wpf-abp B站學習視頻:https://www.bilibili.com/video/BV1nY411a7T8?spm_id_from333.788.player.switch&…

信創緩存中間件-TongRDS(Redis平替)安裝

TongRDS 是由東方通開發的國產 分布式內存數據緩存中間件,功能類似于 Redis,但它是完全自主研發的國產產品,是國內信創的一大重要組件。它兼容 Redis 的接口,能做到應用代碼無需改動即可替換使用。TongRDS是沒有直接的下載地址的。…

Git鏈接備用手冊

三板斧及其他:git init:初始化git倉庫git add . :將所在文件夾中的所有文件加入到暫存區git commit -m 自定義記錄信息 :將暫存區中的數據放到Git的倉庫(本地)中,并進行記錄(自定義&#xff0…

零信任網絡概念及在網絡安全中的應用

零信任網絡概念及在網絡安全中的應用 零信任網絡(Zero Trust Network)是一種顛覆傳統邊界安全的架構理念,其核心是**“永不信任,始終驗證”**(Never Trust, Always Verify)。它假設網絡內外均存在威脅&…

GaussDB case when的用法

1 case函數的類型case具有兩種格式&#xff0c;簡單case函數和case搜索函數。這兩種方式&#xff0c;大部分情況下可以實現相同的功能。1.1 簡單case函數語法case column when <condition> then value when <condition> then value ...... else value end;示例case…

Git用法記錄

代碼中沖突標記的含義&#xff1a;<<<<<<< HEAD 標記當前分支&#xff08;或本地&#xff09;的舊代碼作為分隔線 >>>>>>> [commit哈希] 標記從其他分支合并過來的新代碼&#xff08;這里的 c472b4b... 是提交哈希&#xff09; 暫存…