【MySQL】索引(B+樹詳解)

MySQL(五)索引

一、索引的減I/O設計

1.讀取量

2.搜索樹

2.1方向

2.2有序

3.分多叉

3.1B樹

弊端:

3.2B+樹

3.2.1非葉子-搜索字段

3.2.1.1海量分叉

3.2.1.1.1最大式

3.2.1.1.2最快式

3.2.1.2緩存內存

3.2.1.2.1字段總量小

3.2.1.2.2時間復雜度

3.2.1.3區間搜索向下保留

3.2.1.3.1過程

3.2.1.3.2模式

3.2.1.3.3效果

3.2.2葉子-對應記錄

3.2.2.1全集鍵值對

3.2.2.2鏈表物理連續

3.2.2.3開鍵穩定查詢

二、索引的操作

1.查看

2.創建

2.1創建時機

2.2大表索引的創建

2.2.1直接創建過程

2.2.2危險性

2.2.3正確創建做法

3.刪除


索引 是以字段為鍵記錄為值B+搜索樹

一、索引的減I/O設計

從硬盤搜索讀取 查詢記錄時,由于 一次硬盤讀取數據到內存的時間 是內存里操作數據時間的 10萬倍,MySQL通過 索引?數據結構的設計 減少了查詢記錄的硬盤I/O的次數


1.讀取量

保持著硬盤 單次最大讀取量-頁 最大量地進行讀取 以減少讀取I/O次數,每個B+搜索樹節點的存儲空間 是一個頁,即對應每次讀取完 一個B+搜索樹節點的 總頁存儲空間的內容量


2.搜索樹

2.1方向

在搜索樹中,查詢時 會避免遍歷地 每次往?正確范圍正向增長搜索到概率 的方向進行搜索 直到最后搜索到 也會精確匹配


2.2有序

搜索樹結構?維護了 記錄值 以字段鍵的有序性,支持 以字段的范圍查詢記錄以字段的排序記錄


對比哈希表:?

哈希表雖然能實現 一次硬盤讀取 就可O(1)地查詢到記錄,但只能精確匹配,內部是 以哈希函數維護的?無序數組,無法范圍查詢,也無法進行排序


3.分多叉

在一次讀取的一個節點中 放多個排布搜索對象 分多叉一次更多對象的排布完一次更多對象的搜索完一次搜索接往到 更加細致確定的 范圍區間里來

3.1B樹

鍵值對 單位存儲

鍵值對?合空間 如果很,節點可以直接 大量存儲鍵值對,每個節點 排布海量N個鍵值對?N+1次方地 向下分支排布搜索數據 來完成 海量鍵值對數據的 入樹的排布

弊端:
  • 存儲少-> 排布少-分支少-樹高-I/O高

但在數據庫中,一個值記錄的空間很大,一個鍵字段的空間很小,鍵值對的合空間很大

一個節點一個頁的存儲量 放不了多幾個鍵值對 排布分叉的,每個節點能存儲下來的排布數據少 向下分支少 向下搜索的區間廣?,需要往下分支很多次 才可分布排完數據,樹的高度會很高, 處在葉子節點的大部分鍵值對?要硬盤從頂層 多次讀取搜索到底層 才可搜索到,硬盤I/O總體會很高


  • 記錄在全節點-> 不穩定

作為查詢搜索的結果的 鍵值對里的值記錄,與鍵一塊 直接存儲在 出現的樹節點中,少部分的 在非葉子節點的鍵值對 可以少量I/O地 往下讀取搜索到,大部分的在葉子節點的鍵值對 需要大量I/O地讀取到底層,查詢的時間開銷不穩定


3.2B+樹

鍵與值 分開存儲

B+樹 針對數據庫里?值記錄空間很大,一個搜索樹節點 無法存下過多個鍵值對?去海量分叉排布,將鍵與值分開存儲鍵在非葉子節點搜索值在葉子節點對應

3.2.1非葉子-搜索字段
3.2.1.1海量分叉
3.2.1.1.1最大式

非葉子搜索階段 每個非葉子節點?放無記錄值對應海量鍵字段,一個節點一個頁 就可最多放 多達1600個鍵字段地 大量排布搜索數據 細致劃出排往范圍 地搜索


3.2.1.1.2最快式

內存中 操作數據的速度雖然快,但一次從硬盤讀取到內存的數據 如果處理的單位個數過多,一時間內 內存里也無法快速比較完 個數過多的數據,所以每個節點 放1000個鍵字段 以1000的次方 向下分支排布 存儲搜索的數據,3層 對應3次硬盤讀取 就可排查地搜索完 分支排布到億級的 字段量


3.2.1.2緩存內存
3.2.1.2.1字段總量小

非葉子節點內的 億級總記錄個數的 字段量,由于字段的空間很小,能確保 所有全記錄對應的 字段總空間 是很小的,況且緩存只對非葉子節點?并未對分支到最后一層的葉子節點 的記錄里的 字段量進行緩存,所以非葉子節點里 也不會有 所有記錄個數對應的 總字段量 那么多,非葉子節點字段總空間很小 可以緩存到內存中的


3.2.1.2.2時間復雜度

首次查詢:

非葉子節點字段量 在首次查詢時 B+搜索樹高度次硬盤讀取?從硬盤 把此搜索樹的所有非葉子節點 全部讀取加載到緩存中存放


后續查詢:

在后續查詢時,非葉子節點的字段數據 都已加載在緩存內存中有 不用再硬盤讀取 直接繼續在緩存中 對字段進行搜索 常數時間,然后搜索出指定葉子節點后 再對存儲在硬盤的葉子節點鍵值對?硬盤讀取一次 固定一次硬盤I/O的常數時間,時間復雜度也就成了O(1)


3.2.1.3區間搜索向下保留
3.2.1.3.1過程

非葉子節點的所有鍵字段 都開區間地隱藏?搜索不到,每次對它們搜索完 都作為查詢的?可能的結果鍵 以子區間最大值的形式 往搜索子區間的N叉區域 分別向下傳遞


3.2.1.3.2模式

形成了非葉子節點的 只往區間搜索鍵鍵字段數據向下保留傳遞的 搜索模式


3.2.1.3.3效果

葉子節點整棵樹所有出現過的 父節點區間鍵?與整棵樹在葉子節點 最后剩余出的區間鍵 會構成整棵樹的 從左往右有序的 鍵字段全集


3.2.2葉子-對應記錄
3.2.2.1全集鍵值對

葉子節點層,鍵字段全集的葉子節點 對應存上值記錄全集的鍵值對


3.2.2.2鏈表物理連續

葉子節點之間 再左右相連地 連接成鏈表 使搜索樹邏輯上的有序 再套上了 物理相鄰存儲的有序大大優化了磁盤I/O

搜索樹 范圍查詢數值時,避免了B樹的 范圍查詢回溯節點的硬盤I/O時間開銷,而每到下一個連續數值的鏈表節點 就對應一次硬盤I/O


3.2.2.3開鍵穩定查詢

B+搜索樹都是在葉子節點閉鍵,鍵在葉子節點時?才可以去搜索查詢到的,查詢 會在且只能在 葉子節點搜索查詢到固定了查詢的時間開銷


二、索引的操作

1.查看

show index from tb_name;
show create table tb_name;

查看表中所有的索引

2.創建

create index idx_name on tb_name(col);

為表的指定列字段創建索引?,primary keyuniqueforeign key字段 在創建表時 就會自動創建出索引維護


2.1創建時機

表創建數據空時 或在表的數據量較小時 就要將 要創建的索引創建好


2.2大表索引的創建

2.2.1直接創建過程

為一個記錄量很大的表 創建指定字段的索引

第一層:

從創建的 第1個頂層根節點出發,每個節點里面 都有存儲1000個字段

第二層:

第二層 為第一層根節點里面存儲的1000個排布鍵 分出的1000個字段區域 往下為每個區域 分叉都創建一個 對分到的區域再次存儲有1000個排布鍵的 排布劃分的節點,因此第二層就共創建了1000個節點

第三層:

第三層 為第二層的1000個節點 每個節點 都會分叉1000個區域 每個區域 對應去創建存儲有1000個排布值的 1個節點,第三層就會總共去創建1000*1000個節點

第四層:

再往下層就會去創建1000*1000*1000個節點

第N層:

1000的次方量 往下創建節點,直到葉子所有節點 總共存儲的字段 覆蓋字段全集時,該字段的B+搜索樹 才創建好


2.2.2危險性

工作量巨大,會使服務器 一時間全盤去創建索引的B+搜索樹 而呈掛機狀態


2.2.3正確創建做法

如果就要為一個海量數據的表 創建索引,正確的做法是:

  1. 在另一個mysql服務器上 創建相同結構的空表 創建索引
  2. 再將數據 控制量地 可正常維護索引地 導入建樹,B+搜索樹創建好索引創建好后
  3. 最后對服務器更換轉到使用 此索引創建好的 mysql服務器

3.刪除

drop index idx_name on tb_name;

刪除表中的指定索引

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

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

相關文章

GPT-5博士級AI使用教程及國內平替方案

GPT-5博士級AI使用教程及國內平替方案一、GPT-5核心升級:到底強在哪里?1. **統一入口自動思考模式**2. **256K上下文40萬漢字記憶**3. **人格系統長期記憶**4. **編程能力史詩級增強**二、注冊與訪問:國內用戶也能免費上車1.官方渠道&#xf…

云計算-多服務集群部署實戰指南:從JumpServer到Kafka、ZooKeeper 集群部署實操流程

簡介圍繞企業級服務部署與集群搭建,基于 OpenStack 私有云平臺,介紹了一系列關鍵服務的實操過程。內容涵蓋使用 CentOS7 系統部署 JumpServer 堡壘機并對接 controller 與 compute 節點,構建 RabbitMQ 集群(含磁盤節點與內存節點配…

深入剖析Spring IOC容器——原理、源碼與實踐全解析

🌟 你好,我是 勵志成為糕手 ! 🌌 在代碼的宇宙中,我是那個追逐優雅與性能的星際旅人。 ? 每一行代碼都是我種下的星光,在邏輯的土壤里生長成璀璨的銀河; 🛠? 每一個算法都是我繪制…

探秘C語言:數據在內存中的存儲機制詳解

探秘C語言:數據在內存中的存儲機制詳解探秘C語言:數據在內存中的存儲機制詳解一、二進制與進制轉換:數據的不同"外衣"1.1基本概念1.2進制轉換二、整數在內存中的存儲:補碼的奧秘原碼、反碼、補碼總結探秘C語言&#xff…

HTML 常用標簽介紹

目錄 HTML 標簽 HTML 常用標簽速查表 文檔元標簽 頁面結構與布局 文本內容與排版 鏈接與媒體 列表與表格 表單與交互 其他功能標簽 文本結構標簽 文本格式化標簽 列表標簽 鏈接與導航標簽 媒體標簽 容器與結構標簽 表格標簽 表單標簽 元信息與文檔標簽 腳本…

kafka 沖突解決 kafka安裝

目錄 解法方法&#xff1a; 一般情況正常可以版本2.0.2 報錯&#xff1a; File "<frozen importlib._bootstrap>", line 1050, in _gcd_import File "<frozen importlib._bootstrap>", line 1027, in _find_and_load File "<frozen…

論文閱讀 2025-8-9 [DiC, DropKey]

閑來沒事&#xff0c;找點近一年的論文看看 1. DiC: Rethinking Conv3x3 Designs in Diffusion Models ? 一句話總結&#xff1a;DiC用沙漏架構稀疏跳躍條件門控重構純Conv3x3擴散模型&#xff0c;在速度碾壓Transformer的同時性能反超&#xff0c;為實時生成任務開辟新路徑。…

16進制pcm數據轉py波形腳本

將16bit的單聲道或者雙聲道的16進制的pcm數據轉成波形圖片出來分析數據&#xff0c;python腳本如下&#xff1a;import numpy as np import matplotlib.pyplot as plt# 1: 單聲道&#xff0c;2&#xff1a;雙聲道 PCM_CHANNELS 2# 你提供的十六進制數據 hex_str ""…

MySQL的鎖:

目錄 鎖的介紹&#xff1a; 并發事務訪問相同數據可以分為以下幾種情況&#xff1a; 都是進行讀操作&#xff1a; 都是進行寫操作&#xff1a; 有讀操作也有寫操作&#xff1a; 讀鎖、寫鎖&#xff1a; 讀鎖&#xff1a; 寫鎖&#xff1a; 按照鎖粒度分類&#xff1a;…

一道同分排名的SQL題

1 概述遇到這樣一道題&#xff1a;(1) 有一張學生課程分數表&#xff0c;字段有&#xff1a;ID、名稱、性別、科目、分數。&#xff08;名稱換為學號更能標識唯一學生&#xff0c;但名稱好閱讀&#xff0c;故這里先認為名稱可以唯一標識學生。&#xff09;(2) 用一個SQL&#x…

ICCV 2025 | Reverse Convolution and Its Applications to Image Restoration

標題&#xff1a;Reverse Convolution and Its Applications to Image Restoration作者&#xff1a;Xuhong Huang, Shiqi Liu, Kai Zhang, Ying Tai, Jian Yang, Hui Zeng, Lei Zhang單位&#xff1a;Nanjing University, The Hong Kong Polytechnic University, OPPO Research…

mysql啟動超時

mysql啟動超時&#xff1a; 管理員打開CMD后允許net start MySQL57&#xff0c; 啟動超時檢查錯誤日志 MySQL 啟動失敗的具體原因通常記錄在錯誤日志中。 日志路徑&#xff08;根據你的安裝方式可能不同&#xff09;&#xff1a; 默認位置&#xff1a;C:\ProgramData\MySQL\MyS…

Flink Stream API 源碼走讀 - window 和 sum

本文核心觀點 核心觀點&#xff1a;WindowedStream 是一個"假流"&#xff0c;它比 KeyedStream 更虛&#xff0c;只是一個 API 的過渡器&#xff0c;不是真正意義上的 DataStream&#xff0c;需要調用函數回歸。 虛擬化時刻&#xff1a;從真實流到虛擬流 KeyedStream…

藍牙 GFSK RX Core 架構解析

GFSK RX Core分為以下幾個模塊&#xff1a; 1.Frequency offset compensation CORDIC 2.A low pass filter 3.A power estimator for packet detection,RSSI and digital gaion computation for DPSK path 4.A demodulator implemented as Phase Shift Discriminator 5.A drequ…

微電網管控系統中python多線程緩存與SQLite多數據庫文件連接池實踐總結(含源碼)

1. 引言 在分散的微電網能源管理場景中,系統采用集中式云平臺模式,為100個獨立微電網用戶提供高并發數據寫入服務面臨三大挑戰:用戶數據隔離、I/O性能瓶頸、多線程安全性。本文揭示一種新式的分片鎖+三級緩存+sqlite多數據庫文件連接池架構,在保持SQLite輕量級優勢的同時,…

InfluxDB 開發工具鏈:IDE 插件與調試技巧(一)

引言 ** 在當今數字化時代&#xff0c;時間序列數據的處理與分析在眾多領域中都扮演著至關重要的角色。無論是物聯網設備產生的海量傳感器數據&#xff0c;還是金融市場中實時波動的交易數據&#xff0c;又或是服務器運維過程中不斷產生的性能指標數據&#xff0c;這些都屬于…

計算機網絡-IPv6

1、IPv6基礎IPv4與IPv6的對比&#xff1a;問題IPv4的缺陷IPv6的優勢地址空間IPv4地址采用32比特標識&#xff0c;能提供的地址數量是43億&#xff0c;分配很不均衡。針對IPv4的地址短缺問題&#xff0c;有幾種解決方案&#xff1a;無類別域間路由CIDR&#xff08;Classless Int…

整體設計 之“凝聚式中心點”原型 --整除:智能合約和DBMS的深層融合 之2

摘要&#xff08;CSDN的AI助手自動生成的&#xff09;本文提出了一種基于"整除"數學原型的智能合約與DBMS融合架構設計&#xff0c;將SQL查詢語句的四個關鍵段&#xff08;SELECT、FROM、WHERE、BY&#xff09;分別映射到整除運算的四個要素&#xff08;商、被除數、…

【趙渝強老師】TiDB表數據與鍵值對的映射關系

TiDB實例將表中的每一行數據映射成RocksDB中的鍵值對&#xff0c;則需要考慮如何構造Key和Value。首先&#xff0c;OLTP場景下有大量針對單行或者多行的增、刪、改、查等操作&#xff0c;要求數據庫具備快速讀取一行數據的能力。因此&#xff0c;對應的Key最好有一個唯一ID&…

帶操作系統的延時函數

delay.c:#include "delay.h"/*** brief 微秒級延時* param nus 延時時長&#xff0c;范圍&#xff1a;0~233015* retval 無*/ void delay_us(uint32_t nus) {uint32_t ticks;uint32_t tcnt 0, told, tnow;uint32_t reload SysTick->LOAD; //重…