【MySQL】———— 索引

?9efbcbc3d25747719da38c01b3fa9b4f.gif

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??作者主頁:? ? ?作者主頁

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 本篇博客專欄:Linux

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??創作時間 :2025年7月11日

9efbcbc3d25747719da38c01b3fa9b4f.gif

Mysql索引

索引介紹

索引是什么
  • 根據官方對索引的介紹,索引是幫助MySQL高效的獲取數據的數據結構,在我看來,索引就相當于一本書的目錄項,能加快查找數據的速度
  • 當然,索引本身也是一種資源,索引也要存儲在MySQL中,但是索引一般不會存儲在內存中,因為索引占據的內存還是比較大的,一般的索引都是存儲在磁盤中的文件中
  • 我們通常所說的索引,包括聚集索引、覆蓋索引、組合索引、前綴索引、唯一索引等,沒有特別說明,默認都是使用B+樹結構組織(多路搜索樹,并不一定是二叉的)的索引。

索引的優勢和劣勢

優勢:

  1. 索引可以提高數據檢索的效率,可以快速找到我們想要找到的資源,降低數據庫IO的成本,類似于書的目錄
  2. 通過索引對數據進行排序,可以降低數據排序的成本,降低CPU的消耗
  • 被索引的列會自動進行排序,包括【單列索引】和【組合索引】,只是組合索引的排序要復雜一些。
  • 如果按照索引列的順序進行排序,對應order by語句來說,效率就會提高很多。

劣勢:

  • 索引會占據磁盤空間

  • 索引雖然會提高查詢效率,但是會降低更新表的效率。比如每次對表進行增刪改操作,MySQL不僅要保存數據,還有保存或者更新對應的索引文件。

索引類型

主鍵索引

索引列中的值必須是唯一的,不允許有空值。

普通索引

MySQL中基本索引類型,沒有什么限制,允許在定義索引的列中插入重復值和空值。

唯一索引

索引列中的值必須是唯一的,但是允許為空值。

全文索引

只能在文本類型CHAR,VARCHAR,TEXT類型字段上創建全文索引。字段長度比較大時,如果創建普通索引,在進行like模糊查詢時效率比較低,這時可以創建全文索引。 MyISAM和InnoDB中都可以使用全文索引。

空間索引

MySQL在5.7之后的版本支持了空間索引,而且支持OpenGIS幾何數據模型。MySQL在空間索引這方面遵循OpenGIS幾何數據模型規則。

前綴索引

在文本類型如CHAR,VARCHAR,TEXT類列上創建索引時,可以指定索引列的長度,但是數值類型不能指定。

索引的數據結構

Hash表

我們使用Hash表存儲表數據Key可以存儲索引列,Value可以存儲行記錄或者行磁盤地址。Hash表在等值查詢時效率很高,時間復雜度為O(1);但是不支持范圍快速查找,范圍查找時還是只能通過掃描全表方式。

顯然這種并不適合作為經常需要查找和范圍查找的數據庫索引使用。

二叉搜索樹

二叉樹,我想大家都會在心里有個圖。

這個特點就是為了保證每次查找都可以這折半而減少IO次數,但是二叉樹就很考驗第一個根節點的取值,因為很容易在這個特點下出現我們并發想發生的情況“樹不分叉了”,這就很難受很不穩定。

平衡二叉樹

平衡二叉樹是采用二分法思維,平衡二叉查找樹除了具備二叉樹的特點,最主要的特征是樹的左右兩個子樹的層級最多相差1。在插入刪除數據時通過左旋/右旋操作保持二叉樹的平衡,不會出現左子樹很高、右子樹很矮的情況。

B樹:改造二叉樹

MySQL的數據是存儲在磁盤文件中的,查詢處理數據時,需要先把磁盤中的數據加載到內存中,磁盤IO 操作非常耗時,所以我們優化的重點就是盡量減少磁盤 IO 操作。訪問二叉樹的每個節點就會發生一次IO,如果想要減少磁盤IO操作,就需要盡量降低樹的高度。那如何降低樹的高度呢?

假如key為bigint=8字節,每個節點有兩個指針,每個指針為4個字節,一個節點占用的空間16個字節(8+4*2=16)。

因為在MySQL的InnoDB存儲引擎一次IO會讀取的一頁(默認一頁16K)的數據量,而二叉樹一次IO有效數據量只有16字節,空間利用率極低。為了最大化利用一次IO空間,一個簡單的想法是在每個節點存儲多個元素,在每個節點盡可能多的存儲數據。每個節點可以存儲1000個索引(16k/16=1000),這樣就將二叉樹改造成了多叉樹,通過增加樹的叉樹,將樹從高瘦變為矮胖。構建1百萬條數據,樹的高度只需要2層就可以(1000*1000=1百萬),也就是說只需要2次磁盤IO就可以查詢到數據。磁盤IO次數變少了,查詢數據的效率也就提高了。

這種數據結構我們稱為B樹,B樹是一種多叉平衡查找樹,如下圖主要特點:

B樹的節點中存儲著多個元素,每個內節點有多個分叉。

節點中的元素包含鍵值和數據,節點中的鍵值從大到小排列。也就是說,在所有的節點都儲存數據。

父節點當中的元素不會出現在子節點中。

所有的葉子結點都位于同一層,葉節點具有相同的深度,葉節點之間沒有指針連接。

B+樹:改造B樹

B+樹,作為B樹的升級版,在B樹基礎上,MySQL在B樹的基礎上繼續改造,使用B+樹構建索引。B+樹和B樹最主要的區別在于非葉子節點是否存儲數據的問題

  • B樹:非葉子節點和葉子節點都會存儲數據。
  • B+樹:只有葉子節點才會存儲數據,非葉子節點至存儲鍵值。葉子節點之間使用雙向指針連接,最底層的葉子節點形成了一個雙向有序鏈表。

Mysql的索引實現

介紹完了索引數據結構,那肯定是要帶入到Mysql里面看看真實的使用場景的,所以這里分析一下一種實現方式:InnoDB索引

InnoDB索引
主鍵索引(聚簇索引)

每個InnoDB表都有一個聚簇索引 ,聚簇索引使用B+樹構建,葉子節點存儲的數據是整行記錄。一般情況下,聚簇索引等同于主鍵索引,當一個表沒有創建主鍵索引時,InnoDB會自動創建一個ROWID字段來構建聚簇索引。InnoDB創建索引的具體規則如下:

  • 在表上定義主鍵PRIMARY KEY,InnoDB將主鍵索引用作聚簇索引。
  • 如果表沒有定義主鍵,InnoDB會選擇第一個不為NULL的唯一索引列用作聚簇索引。
  • 如果以上兩個都沒有,InnoDB 會使用一個6 字節長整型的隱式字段 ROWID字段構建聚簇索引。該ROWID字段會在插入新行時自動遞增。

除聚簇索引之外的所有索引都稱為輔助索引。在中InnoDB,輔助索引中的葉子節點存儲的數據是該行的主鍵值都。 在檢索時,InnoDB使用此主鍵值在聚簇索引中搜索行記錄。

這里以user_innodb為例,user_innodb的id列為主鍵,age列為普通索引。

CREATE TABLE `user_innodb`
(`id`       int(11) NOT NULL AUTO_INCREMENT,`username` varchar(20) DEFAULT NULL,`age`      int(11)     DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,KEY `idx_age` (`age`) USING BTREE
) ENGINE = InnoDB;

總結:

避免回表

在InnoDB的存儲引擎中,使用輔助索引查詢的時候,因為輔助索引葉子節點保存的數據不是當前記錄的數據而是當前記錄的主鍵索引,索引如果需要獲取當前記錄完整數據就必然需要根據主鍵值從主鍵索引繼續查詢。這個過程我們成位回表。想想回表必然是會消耗性能影響性能。那如何避免呢?

使用索引覆蓋,舉個例子:現有User表(id(PK),name(key),sex,address,hobby…)

如果在一個場景下,select id,name,sex from user where name ='zhangsan';這個語句在業務上頻繁使用到,而user表的其他字段使用頻率遠低于它,在這種情況下,如果我們在建立 name 字段的索引的時候,不是使用單一索引,而是使用聯合索引(name,sex)這樣的話再執行這個查詢語句是不是根據輔助索引查詢到的結果就可以獲取當前語句的完整數據。這樣就可以有效地避免了回表再獲取sex的數據。

最后:

十分感謝你可以耐著性子把它讀完和我可以堅持寫到這里,送幾句話,對你,也對我:

1.一個冷知識:
屏蔽力是一個人最頂級的能力,任何消耗你的人和事,多看一眼都是你的不對。

2.你不用變得很外向,內向挺好的,但需要你發言的時候,一定要勇敢。
正所謂:君子可內斂不可懦弱,面不公可起而論之。

3.成年人的世界,只篩選,不教育。

4.自律不是6點起床,7點準時學習,而是不管別人怎么說怎么看,你也會堅持去做,絕不打亂自己的節奏,是一種自我的恒心。

5.你開始炫耀自己,往往都是災難的開始,就像老子在《道德經》里寫到:光而不耀,靜水流深。

最后如果覺得我寫的還不錯,請不要忘記點贊?,收藏?,加關注?哦(。・ω・。)

愿我們一起加油,奔向更美好的未來,愿我們從懵懵懂懂的一枚菜鳥逐漸成為大佬。加油,為自己點贊!

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

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

相關文章

頁面html,當鼠標點擊圖標,移開圖標,顏色方塊消失

html頁面代碼&#xff1a;<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>顏色選擇器</title><style>body {font-family: "Microsoft YaHei", sans-serif;padding: 20px;}.c…

netdxf—— CAD c#二次開發之(netDxf 處理 DXF 文件)

1.創建新項目打開 VS2022&#xff0c;選擇 "創建新項目"搜索 "控制臺應用"&#xff0c;選擇 ".NET 6.0 (C#)" 模板&#xff0c;點擊 "下一步"項目名稱&#xff1a;"DxfProcessor"&#xff0c;位置&#xff1a;自選&#xff…

如何將一個本地的jar包安裝到 Maven 倉庫中

我們需要執行以下步驟&#xff1a; 首先&#xff0c;打開命令提示符&#xff08;CMD&#xff09;或 PowerShell&#xff0c;執行以下命令&#xff1a; mvn install:install-file ^ -Dfile"你的jar包路徑" ^ -DgroupId"組織ID" ^ -DartifactId"項目ID&…

AI賦能的企業音頻智能中樞:重構會議價值提升決策效率的數字化轉型實踐

在當今快節奏的商業環境中&#xff0c;企業管理者每天都要處理海量信息&#xff0c;其中音頻內容占據了重要位置。你是否經常遇到這樣的困擾&#xff1a;重要會議結束后&#xff0c;錄音文件靜靜躺在設備里&#xff0c;遲遲無法變成可用的會議紀要跨部門協作時&#xff0c;收到…

醫學+AI!湖北中醫藥大學信息工程學院與和鯨科技簽約101數智領航計劃

為積極推動人工智能與中醫藥信息化深度融合&#xff0c;著力培育既精通中醫藥理論又掌握人工智能技術的復合型人才&#xff0c;6 月 27 日&#xff0c;湖北中醫藥大學信息工程學院與上海和今信息科技有限公司&#xff08;以下簡稱 “和鯨科技”&#xff09;召開校企合作座談會&…

全面掌控 Claude Code:命令 + 參數 + 快捷鍵一文全整理(建議收藏)

近日&#xff0c;隨著Cursor套餐定價的風波&#xff0c;Claude Code 無疑成為了最近頗受歡迎的代碼助手&#xff0c;不僅支持多種編程語言&#xff0c;還比Cursor更能理解復雜的上下文邏輯&#xff0c;極受廣大開發者的青睞。 不過&#xff0c;與其他AI編程助手不同的是&#x…

深度學習-正則化

摘要 本文系統闡述了深度學習中的正則化技術體系&#xff0c;圍繞防止過擬合這一核心目標展開。首先通過偏差-方差框架解析過擬合/欠擬合本質&#xff0c;并使用對比表明確區分特征&#xff1b;其次深入分析了L1/L2正則化的數學原理&#xff08;2mλ?∥w∥2與mλ?∥w∥1?&a…

STM32之風扇模塊(開關控制+PWM調速)

目錄 一、系統概述 二、5V直流風扇模塊簡介 2.1 基本概述 2.2 關鍵特性 2.3 接口定義 2.4 典型驅動電路 2.4.1 繼電器驅動方案&#xff08;開關控制&#xff09; 2.4.2 三極管驅動方案&#xff08;調速控制&#xff09; 2.5 常見問題解決 三、繼電器模塊控制風…

AGX Xavier 搭建360環視教程【二、環境配置】

AGX Xavier 場景下的 【OpenCV FFmpeg CUDA GStreamer】 重裝 & 編譯的2025年穩定方案? 1?? 先卸載老版本AGX 自帶很多預裝包&#xff0c;原則&#xff1a;卸載干凈&#xff0c;避免舊庫和新編譯沖突。&#x1f539; 卸載 OpenCVdpkg -l | grep opencv sudo apt-get …

Cesium實戰:交互式多邊形繪制與編輯功能完全指南(最終修復版)

&#x1f4cb; 文章目錄 引言功能概述環境準備核心實現步驟 地圖初始化多邊形繪制頂點編輯功能顏色與透明度自定義面積計算與顯示 常見問題解決方案 多邊形顏色顯示異常面積標簽不可見控制臺alpha類型錯誤地圖交互無法恢復 完整代碼總結與擴展 引言 Cesium作為一款強大的3D地…

SQL判斷先判斷條件1是否符合,條件1不符合再判斷條件2

偽代碼假設存在條件1和條件2SELECT * FROM table1 WHERE 條件1 AND 條件2方法1&#xff1a;先判斷條件1是否符合,條件1不符合再判斷條件2是否滿足&#xff1a;SELECT * FROM table1 WHERE (條件1) OR (NOT 條件1 AND 條件2);方法 2: 使用 IF 或數據庫特有函數&#xff08;…

游戲的程序員會不會偷偷改自己賬號的數據?

看到這個問題&#xff0c;我忍不住笑了。 作為一個在程序員這條路上摸爬滾打了快10年的老司機&#xff0c;雖然我主要專精嵌入式開發&#xff0c;但我也接觸過不少游戲開發的朋友&#xff0c;對游戲行業的內部運作有一定了解。這個問題可以說是每個游戲玩家都曾經想過的&#x…

uniapp小程序tabbar跳轉攔截與彈窗控制

一、第一步1、App.vue中定義globalData用于全局存儲狀態globalData:{needShowReleaseConfirm: false, // 標記是否需要顯示發布頁面確認彈窗allowReleaseJump: false ,// 標記是否允許跳轉到發布頁面},2、在App.vue中的onLaunch寫入監聽事件onLaunch: function() {// 添加switc…

華為網路設備學習-26(BGP協議 一)

一、AS&#xff08;自治系統&#xff09;AS&#xff08;自治系統&#xff09;的大小通常指其分配的唯一編號&#xff0c;范圍分為兩種&#xff1a;?2字節AS號?&#xff1a;取值范圍1至65535&#xff08;其中64512-65535為私有AS號&#xff09; ??4字節AS號?&#xff1a;取…

大模型開發框架LangChain之函數調用

1.前言 之前一直使用 dify開發 agent&#xff0c;雖然功能很全面、效果也穩定&#xff0c;但是也存在流程固化、不靈活&#xff0c;以及 dify本身太重&#xff08;內部包含10個容器&#xff09;等問題。 故最近研究了大名頂頂的 langchain&#xff0c;先從函數調用開始&#xf…

pycharm中自動補全方法返回變量

使用IDEA開發java中&#xff0c;可以使用altenter 快捷鍵快速補全方法放回的變量使用pycharm也想實現此效果&#xff0c;如下圖操作方法&#xff1a;pycharm中默認的補全方法返回變量的快捷鍵是&#xff1a;CtrlAltv 可以直接使用默認快捷鍵&#xff0c;也可以在settings->k…

Set 二分 -> 劍指算法競賽

C【STL】集合set 標準庫提供 set 關聯容器分為&#xff1a; 按關鍵字有序保存元素&#xff1a;set&#xff08;關鍵字即值&#xff0c;即只保存關鍵字的容器&#xff09;、multiset&#xff08;關鍵字可重復出現的 set&#xff09;&#xff1b; 無序集合&#xff1a;unordered…

php的原生類

前言&#xff1a;累麻了&#xff01; 反射類 反射類 ReflectionClass&#xff1a;ReflectionClass 類報告了一個類的有關信息。正如其名用于映射反射一個類的類&#xff01; new ReflectionClass(MyClass) 會創建一個 ReflectionClass 實例&#xff0c;代表 MyClass 這個類。 …

PC網站和uniapp安卓APP、H5接入支付寶支付

首先我們需要完成支付寶賬號注冊&#xff0c;支持的賬號類型&#xff1a;支付寶企業賬號、支付寶個人賬號、個體工商戶。 到支付寶商家平臺 產品中心開通APP支付、手機網站支付、電腦網站支付的產品權限。 一、電腦PC網站接入 電腦PC網站支付是指商戶在電腦網頁展示商品或服務&…

MCU芯片內部的ECC安全機制

MCU&#xff08;微控制器單元&#xff09;芯片內部的 ECC&#xff08;錯誤檢測與糾正&#xff09;安全機制 是一種至關重要的硬件級可靠性技術&#xff0c;主要用于保護關鍵存儲單元&#xff08;如 SRAM、Flash、Cache&#xff09;中的數據完整性&#xff0c;防止因外部干擾或硬…