MySQL的索引是什么

MySQL的索引

  • 一、索引概述
  • 二、索引結構
    • 1.簡要概述
    • 2.從二叉樹說起
    • 3.再在說下B-Tree
    • 4.為什么選擇B+Tree
    • 5.Hash又是什么
    • 6.博主被面試官經常問的題目
  • 三、索引分類
  • 四、聚集索引&二級索引
  • 五、索引語法

一、索引概述

1.索引是幫助MySQL 高效獲取數據的數據結構(有序)。在數據之外,數據庫系統還維護著滿足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據, 這樣就可以在這些數據結構上實現高級查找算法,這種數據結構就是索引
在這里插入圖片描述

2 .假設有一張表結構如下:

在這里插入圖片描述
我們要執行的SQL語句為 : select * from user where age = 45;

  • 無索引情況:在無索引情況下,就需要從第一行開始掃描,一直掃描到最后一行,我們稱之為 全表掃描,性能很低
    在這里插入圖片描述
  • 有索引情況:如果我們針對于這張表建立了索引,假設索引結構就是二叉樹,那么也就意味著,會對age這個字段建立一個二叉樹的索引結構
    在這里插入圖片描述
    3.索引的特點:
優點缺點
提高數據檢索的效率,降低數據庫的IO成本索引列也是要占用空間的
通過索引列對數據進行排序,降低數據排序的成本,降低CPU的消耗索引大大提高了查詢效率,同時卻也降低更新表的速度,如對表進行INSERT、UPDATE、DELETE時,效率降低

二、索引結構

1.簡要概述

1.MySQL的索引是在存儲引擎層實現的,不同的存儲引擎有不同的索引結構,主要包含以下幾種

索引結構描述
B+Tree索引最常見的索引類型,大部分引擎都支持 B+ 樹索引
Hash索引底層數據結構是用哈希表實現的, 只有精確匹配索引列的查詢才有效, 不支持范圍查詢
R-tree(空間索引)空間索引是MyISAM引擎的一個特殊索引類型,主要用于地理空間數據類型,通常使用較少
Full-text(全文索引)是一種通過建立倒排索引,快速匹配文檔的方式。類似于Lucene,Solr,ES

2.我們再來看看不同的存儲引擎對于索引結構的支持情況:

注意: 我們平常所說的索引,如果沒有特別指明,都是指B+樹結構組織的索引

索引InnoDBMyISAMMemory
B+tree索引支持支持支持
Hash 索引不支持不支持支持
R-tree 索引不支持支持不支持
Full-text5.6版本之后支持支持不支持

2.從二叉樹說起

1.假如說MySQL的索引結構采用二叉樹的數據結構,比較理想的結構如下:
在這里插入圖片描述
2.如果主鍵是順序插入的,則會形成一個單向鏈表,結構如下:
在這里插入圖片描述
3.所以,如果選擇二叉樹作為索引結構,會存在以下缺點:

  • 順序插入時,會形成一個鏈表,查詢性能大大降低。

  • 大數據量情況下,層級較深,檢索速度慢。

4.此時可能會想到,我們可以選擇紅黑樹,紅黑樹是一顆自平衡二叉樹,那這樣即使是順序插入數據,最終形成的數據結構也是一顆平衡的二叉樹,結構如下:
在這里插入圖片描述
5.但是,即使如此,由于紅黑樹也是一顆二叉樹,所以也會存在一個缺點

  • 大數據量情況下,層級較深,檢索速度慢

3.再在說下B-Tree

1.定義:B-Tree,B樹是一種多叉路衡查找樹,相對于二叉樹,B樹每個節點可以有多個分支,即多叉

2.以一顆最大度數(max-degree)為5(5階)的b-tree為例,那這個B樹每個節點最多存儲4個key,5個指針:

樹的度數指的是一個節點的子節點個數

在這里插入圖片描述
4.通過一個數據結構可視化的網站來簡單演示一下:https://www.cs.usfca.edu/~galles/visualization/BTree.html
在這里插入圖片描述
5.插入一組數據: 100 65 169 368 900 556 780 35 215 1200 234 888 158 90 1000 88 120 268 250 。然后觀察一些數據插入過程中,節點的變化情況
在這里插入圖片描述
6.特點:

  • 5階的B樹,每一個節點最多存儲4個key,對應5個指針。
  • 一旦節點存儲的key數量到達5,就會裂變,中間元素向上分裂。
  • 在B樹中,非葉子節點和葉子節點都會存放數據。

4.為什么選擇B+Tree

1.B+Tree是B-Tree的變種,我們以一顆最大度數(max-degree)為4(4階)的b+tree為例,來看一下其結構示意圖:
在這里插入圖片描述
2.我們可以看到,兩部分:

  • 綠色框框起來的部分,是索引部分,僅僅起到索引數據的作用,不存儲數據。
  • 紅色框框起來的部分,是數據存儲部分,在其葉子節點中要存儲具體的數據。形成單向鏈表結構

3.再次通過數據結構可視化的網站來簡單演示。 https://www.cs.usfca.edu/~galles/visualization/BPlusTree.html
在這里插入圖片描述
4.插入一組數據: 100 65 169 368 900 556 780 35 215 1200 234 888 158 90 1000 88 120 268 250 。然后觀察一些數據插入過程中,節點的變化情況。
在這里插入圖片描述
5.最終我們看到,B+Tree 與 B-Tree相比,主要有以下三點區別:

  • 所有的數據都會出現在葉子節點。
  • 葉子節點形成一個單向鏈表。
  • 非葉子節點僅僅起到索引數據作用,具體的數據都是在葉子節點存放的。

6.最終可以看到,B+Tree 與 B-Tree相比,主要有以下三點區別:

  • 所有的數據都會出現在葉子節點。
  • 葉子節點形成一個單向鏈表。
  • 非葉子節點僅僅起到索引數據作用,具體的數據都是在葉子節點存放的。

7.MySQL索引數據結構對經典的B+Tree進行了優化。在原B+Tree的基礎上,增加一個指向相鄰葉子節點的鏈表指針,就形成了帶有順序指針的B+Tree,提高區間訪問的性能,利于排序
在這里插入圖片描述

5.Hash又是什么

1.MySQL中除了支持B+Tree索引,還支持一種索引類型—Hash索引

2.結構:哈希索引就是采用一定的hash算法,將鍵值換算成新的hash值,映射到對應的槽位上,然后存儲在hash表中
在這里插入圖片描述

3.如果兩個(或多個)鍵值,映射到一個相同的槽位上,他們就產生了hash沖突(也稱為hash碰撞),可以通過鏈表來解決
在這里插入圖片描述

2.特點

  • Hash索引只能用于對等比較(=,in),不支持范圍查詢(between,>,< ,…)

  • 無法利用索引完成排序操作

  • 查詢效率高,通常(不存在hash沖突的情況)只需要一次檢索就可以了,效率通常要高于B+tree索引

4.存儲引擎支持:在MySQL中,支持hash索引的是Memory存儲引擎。 而InnoDB中具有自適應hash功能,hash索引是InnoDB存儲引擎根據B+Tree索引在指定條件下自動構建的

6.博主被面試官經常問的題目

面試題: 為什么InnoDB存儲引擎選擇使用B+tree索引結構

  • 相對于二叉樹,層級更少,搜索效率高;
  • 對于B-tree,無論是葉子節點還是非葉子節點,都會保存數據,這樣導致一頁中存儲的鍵值減少,指針跟著減少,要同樣保存大量數據,只能增加樹的高度,導致性能降低;
  • 相對Hash索引,B+tree支持范圍匹配及排序操作;

三、索引分類

在MySQL數據庫,將索引的具體類型主要分為以下幾類:主鍵索引、唯一索引、常規索引、全文索引

分類含義特點關鍵字
主鍵索引針對于表中主鍵創建的索引默認自動創建, 只能有一個PRIMARY
唯一索引避免同一個表中某數據列中的值重復可以有多個UNIQUE
常規索引快速定位特定數據可以有多個
全文索引全文索引查找的是文本中的關鍵詞,而不是比較索引中的值可以有多個FULLTEXT

四、聚集索引&二級索引

1.在InnoDB存儲引擎中,根據索引的存儲形式,又可以分為以下兩種

分類含義特點
聚集索引(Clustered Index)將數據存儲與索引放到了一塊,索引結構的葉子節點保存了行數據必須有,而且只有一個
二級索引(Secondary Index)將數據與索引分開存儲,索引結構的葉子節點關聯的是對應的主鍵可以存在多個

2.聚集索引選取規則:

  • 如果存在主鍵,主鍵索引就是聚集索引。

  • 如果不存在主鍵,將使用第一個唯一(UNIQUE)索引作為聚集索引。

  • 如果表沒有主鍵,或沒有合適的唯一索引,則InnoDB會自動生成一個rowid作為隱藏的聚集索引。

3.聚集索引和二級索引的具體結構如下:

在這里插入圖片描述

  • 聚集索引的葉子節點下掛的是這一行的數據
  • 二級索引的葉子節點下掛的是該字段值對應的主鍵值

4.執行如下SQL語句時,具體的查找過程是什么樣子的

在這里插入圖片描述
具體過程如下:

  1. 由于是根據name字段進行查詢,所以先根據name='Arm’到name字段的二級索引中進行匹配查找。但是在二級索引中只能查找到 Arm 對應的主鍵值 10。

  2. 由于查詢返回的數據是*,所以此時,還需要根據主鍵值10,到聚集索引中查找10對應的記錄,最終找到10對應的行row。

  3. 最終拿到這一行的數據,直接返回即可。

5.回表查詢: 這種先到二級索引中查找數據,找到主鍵值,然后再到聚集索引中根據主鍵值,獲取數據的方式,就稱之為回表查詢

五、索引語法

  1. 創建索引
CREATE  [ UNIQUE | FULLTEXT ]  INDEX  index_name  ON  table_name  ( index_col_name,... ) ;
  • UNIQUE表示唯一索引,FULLTEXT表示全文索引

  • INDEX表示索引關鍵字

  • index_name設置的自定義索引名稱

  • ON表示是為哪張表設置的索引

  • table_name表示具體設置索引的表名

  • index_col_name表示設置索引的列名,可以設置多個列名組成聯合索引

  1. 查看索引
SHOW  INDEX  FROM  table_name ;
  1. 刪除索引
DROP  INDEX  index_name  ON  table_name ;

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

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

相關文章

[STM32-HAL庫]Flash庫-HAL庫-復雜數據讀寫-STM32CUBEMX開發-HAL庫開發系列-主控STM32F103C6T6

目錄 一、前言 二、實現步驟 1.STM32CUBEMX配置 2.導入Flash庫 3.分析地址范圍 4.找到可用的地址 5.寫入讀取普通數據 6.寫入讀取字符串 6.1 存儲相關信息 6.2 存取多個參數 三、總結及源碼 一、前言 在面對需要持久化存儲的數據時&#xff0c;除了掛載TF卡&#xff0c;我們…

燃數科技前端25-40K*14薪一面超簡單,下周二面啦

一面 1、自我介紹 2、低代碼如何設計的 3、react路由原理 4、react生命周期 5、什么是回調地獄&#xff0c;如何解決 6、jwt和session有什么區別 7、js文件相互引用有什么問題&#xff1f;如何解決 8、一個很大的json文件&#xff0c;前端讀取如何優化 面試我的不像是…

為什么說 Redis 是單線程的?——Java全棧知識(25)

為什么說 Redis 是單線程的&#xff1f; 我們常說的 Redis 是單線程的&#xff0c;但是我前面在講持久化機制的時候又說 RDB 的持久化是通過主進程 fork 出一個子進程來實現 RDB 持久化。那么 Redis 到底是多線程還是單線程的呢&#xff1f; Redis 的網絡 IO 和鍵值的讀寫是單…

力扣:1306. 跳躍游戲 III

1306. 跳躍游戲 III 這里有一個非負整數數組 arr&#xff0c;你最開始位于該數組的起始下標 start 處。當你位于下標 i 處時&#xff0c;你可以跳到 i arr[i] 或者 i - arr[i]。 請你判斷自己是否能夠跳到對應元素值為 0 的 任一 下標處。 注意&#xff0c;不管是什么情況下…

數據庫|基于T-SQL創建數據庫

哈嘍&#xff0c;你好啊&#xff0c;我是雷工&#xff01; SQL Server用于操作數據庫的編程語言為Transaction-SQL,簡稱T-SQL。 本節學習基于T-SQL創建數據庫。以下為學習筆記。 01 打開新建查詢 首先連接上數據庫&#xff0c;點擊【新建查詢】打開新建查詢窗口&#xff0c; …

appium-driver方法待整理。。

app C:\Users\v-hongweishi\AppData\Local\Programs\Xmind\Xmind.exe deviceName DESKTOP-7NJ1ENB platformName Windows 應用程序ID&#xff08;AppId&#xff09;是應用程序用戶模型 ID (AppUserModelID)&#xff0c;簡稱 AUMID Outlook …

Leetcode 113:路徑總和II

給你二叉樹的根節點 root 和一個整數目標和 targetSum &#xff0c;找出所有 從根節點到葉子節點 路徑總和等于給定目標和的路徑。 葉子節點 是指沒有子節點的節點。 public static List<List<Integer>> pathSum(TreeNode root, int targetSum) {List<List&l…

C++—結構體

結構體&#xff08;struct&#xff09;&#xff0c;是一種用戶自定義復合數據類型&#xff0c;可以包含不同類型的不同成員。 結構體的聲明定義和使用的基本語法&#xff1a; // 聲明結構體struct 結構體類型 { 成員1類型 成員1名稱; ...成員N類型 成員N名稱; };除聲明…

【計算機視覺(2)】

基于Python的OpenCV基礎入門——視頻的處理 視頻OpenCV視頻處理操作&#xff1a;創建視頻對象判斷視頻是否成功初始化讀取視頻幀獲取視頻特征設置視頻參數聲明編碼器保存視頻釋放視頻對象 視頻處理基本操作的代碼實現&#xff1a; 視頻 視頻是由一系列連續的圖像幀組成的。每一…

Spring—IoC

目錄 1. IoC的提出 2. Spring容器 2.1. Spring容器實現原理 2.2. Spring組件 2.2.1 XML標簽方式 2.2.2. 類注解方式 2.2.3. 方法注解方式 2.3. Spring容器分類 2.3.1. BeanFactory容器 2.3.2. ApplicationContext容器 2.3.3. WebApplicationContext容器 3. Spring中…

Srping 歷史

一、History of Spring and the Spring Framework Spring came into being in 2003 as a response to the complexity of the early J2EE specifications. While some consider Java EE and its modern-day successor Jakarta EE to be in competition with Spring, they are …

nginx 配置stream模塊代理并開啟日志配置

前言 nginx 1.20.1 nginx從1.9.0開始,新增加了一個stream模塊 確保nginx 安裝時開啟stream模塊 ./configure \ …… \ --with-stream \ --with-stream_ssl_module \ 修改nginx.conf #增加stream配置&#xff0c;開啟stream模塊 stream {log_format basic $remote_addr [$…

stm32 作為從機, fpga 作為主機,進行 spi 通信

stm32 作為從機, fpga 作為主機,進行 spi 通信 STM32和FPGA之間的SPI通信是直連形式。使用FPGA讀取傳感器的值,傳輸到STM32中進行計算。 STM32是將SPI接受過來的數據存儲到DMA中。 #include "SPI_DMA.h" #include <stm32f10x.h> uint8_t spi_buf[4];//FP…

idea啟動報錯:java.lang.NoClassDefFoundError: org/mybatis/logging/LoggerFactory

文章目錄 一、問題二、解決方法 一、問題 問題描述&#xff1a;idea整合Mybatis-plus的時候&#xff0c;啟動報錯&#xff1a;java.lang.NoClassDefFoundError: org/mybatis/logging/LoggerFactory 二、解決方法 可能原因&#xff1a;仔細檢查了一下&#xff0c;發現 mybati…

《王者榮耀》4月狂攬2.34億美元 單日流水1億美元 全球銷量第二

易采游戲網5月24日消息&#xff0c;在剛剛過去的四月&#xff0c;全球手游市場迎來了一場收益的盛宴&#xff0c;其中《王者榮耀》以其驚人的吸金能力&#xff0c;以2.34億美元的月收入在全球手游排行榜上位列第二。4月5日&#xff0c;這款由騰訊游戲開發的多人在線戰斗競技游戲…

C++相關概念和易錯語法(14)(初始化注意事項、vector、編譯器向上查找規則)

1.當我們在代碼中想要終止運行的話&#xff0c;我們可以采用Ctrl C或Ctrl Z&#xff0c;其中^C代表殺進程&#xff0c;^Z設置結束2.編碼表&#xff1a;我們目前比較熟悉的是ASCII碼編碼方式&#xff0c;但是我們發現平時使用的漢字無法通過ASCII編碼&#xff0c;除此之外&…

前端canvas項目實戰——在線圖文編輯器:序

目錄 前言一、 博主是誰&#xff1f;二、 關于本專欄1. 本專欄涉及的技術棧2. 專欄適合誰來學習&#xff1f;3. 你可以從專欄學到什么&#xff1f;4. 系列文章索引 三、 付費信息后記 前言 很高興&#xff0c;今天我又為自己設定了一個目標&#xff1a;帶領大家從入門HTML5中的…

自動化測試用例結構

標準的用例結構&#xff1a; 用力標題前提條件用例步驟預期結果實際結果 測試用例對比&#xff1a;

酷開系統 | 酷開科技把握智慧先機 AI賦能家庭場景

智慧化是當今世界科技發展的前沿領域之一。現在的智慧化&#xff0c;也正在逐步成為我們日常生活的一部分。電視系統也進入了數字化時代&#xff0c;AI的應用正在不斷擴展&#xff0c;其潛力似乎無窮無盡。 酷開科技深耕人工智能技術&#xff0c;在提升語音體驗、強化智能家居…

(1)無線電失控保護(二)

文章目錄 前言 4 參數配置 5 測試 6 使用接收器設置飛行模式(