MySQL進階篇(02):索引體系劃分,B-Tree結構說明

来源:https://www.cnblogs.com/cicada-smile/archive/2020/06/08/13068677.html
-Advertisement-
Play Games

本文源碼:GitHub·點這裡 || GitEE·點這裡 一、索引簡介 1、基本概念 首先要明確索引是什麼:索引是一種數據結構,數據結構是電腦存儲、組織數據的方式,是指相互之間存在一種或多種特定關係的數據元素的集合,例如:鏈表,堆棧,隊列,二叉樹等等。 其次要清楚索引的作用:索引可以使存儲引擎快速 ...


本文源碼:GitHub·點這裡 || GitEE·點這裡

一、索引簡介

1、基本概念

首先要明確索引是什麼:索引是一種數據結構,數據結構是電腦存儲、組織數據的方式,是指相互之間存在一種或多種特定關係的數據元素的集合,例如:鏈表,堆棧,隊列,二叉樹等等。

其次要清楚索引的作用:索引可以使存儲引擎快速找到數據記錄,這是最基本的作用,索引是對查詢速度最關鍵的影響,良好的索引設計可以使查詢的效率有質的飛越。

索引的使用:如果查詢語句使用所有,MySQL會在索引的數據結構上查詢,如果查詢到,就返回包含該索引的數據行。

2、索引的優點

  • 唯一或者主鍵索引,保證列數據的唯一性
  • 減少數據掃描量,快速查詢數據;
  • 數據有序的索引,可以將隨機IO變成順序IO;
  • 有效的索引查詢,可以避免排序和臨時表;

3、索引分類

索引的種類非常多,如何分類取決多個場景和不同的角度,常見的劃分如下:

  • 產生作用:主鍵索引,普通索引,非空索引,全文索引;
  • 覆蓋欄位:單列索引,組合索引;
  • 數據結構:B-Tree索引,哈希索引,R-Tree索引;

註意:索引的實現是在存儲引擎層面,相同的索引在不同的存儲引擎中,其實現方式可能都是不一樣的。

二、索引用法詳解

1、不同索引特點

普通索引

基本的索引,沒有任何使用限制,主要用來加速數據查詢。適合經常出現在查詢條件或排序條件中的數據列。

主鍵索引

特殊的唯一索引,不允許有空值,在建表的時候指定主鍵,就會創建主鍵索引,MySQL中最核心的索引,大量的業務數據都是基於主鍵查詢。

唯一索引

普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須是唯一性的。

全文索引

用於全文搜索,通過建立全文索引,基於分詞的查詢模式,可以極大的提升檢索效率。

組合索引

創建的索引覆蓋兩個或者兩個以上的列,適應組合查詢的場景,也常用於要素驗證的業務,例如判斷用戶身份ID,手機號,郵箱,是否為同一個用戶。

2、管理索引語法

基礎用戶表

CREATE TABLE user_base (
	id INT (11) NOT NULL AUTO_INCREMENT COMMENT '主鍵ID',
	user_name VARCHAR (20) NOT NULL COMMENT '用戶名',
	phone VARCHAR (20) NOT NULL COMMENT '手機號',
	email VARCHAR (32) DEFAULT NULL COMMENT '郵箱',
	card_id VARCHAR (32) DEFAULT NULL COMMENT '身份編號',
	create_time datetime DEFAULT NULL COMMENT '創建時間',
	state INT (1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用',
	PRIMARY KEY (`id`)
) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '用戶基礎表';

創建單列索引

CREATE INDEX card_id_index ON user_base(card_id);

修改添加索引

ALTER TABLE user_base ADD INDEX state_index(state) ;

創建組合索引

CREATE INDEX bind_index ON user_base(phone,card_id);

刪除索引

DROP INDEX card_id_index ON user_base ;

修改索引

MySQL不支持真正修改索引的語法規範,可以通過刪除舊索引,添加新索引的方式進行操作。

3、查詢索引

分析MySQL查詢,多數情況下用來分析執行語句的SQL中是否使用索引,是否產生臨時表等性能相關問題。

基礎用法

EXPLAIN SELECT * FROM user_base WHERE id='1';

參數說明

  • id:相同,按table列由上至下順序執行,不同,如果是子查詢,id的序號會遞增,id的值越大優先順序越高,越先被執行;
  • select_type:表示查詢的類型,主要是用於區別普通查詢、聯合查詢、子查詢等的複雜查詢;
simple:簡單select查詢,查詢中不包含子查詢或者
primary:查詢中若包含複雜的子部分,最外層查詢則被標記為primary
subquery:select或where中包含子查詢
derived:from中包含的子查詢被標記為derived衍生,mysql會遞歸執行這些子查詢,且生成臨時表
union:第二個select出現在union後,標記為union
union-result:從union表獲取結果的select
  • table:指當前執行計劃中的數據表;
  • type:說明的是查詢使用了哪種類型,下麵從好到差排序;
system-const:對查詢的某部分進行優化並轉換成一個常量時,會使用該類型
eq_ref:常見於主鍵或唯一索引掃描,表中只有一條記錄與之匹配
ref:非唯一性索引掃描,返回匹配某個單獨值的所有行
index:遍歷索引結構,索引文件通常比數據文件小
all:遍歷全表進行查詢
  • possible_keys:在查詢中可能使用到的索引;
  • key:在查詢中實際使用到的索引;
  • key_len:查詢中索引欄位的最大可能長度,在不損失精確性的情況下,長度越短越好;
  • ref:表示本行被操作的對象的參照對象,可能是一個常量用const表示,也可能是其他表的key指向的對象;
  • rows:預估找到符合要求的記錄所需要掃描的行數,掃描越少越好;
  • extra:執行計劃中,一些十分重要的信息;
Using-Filesort:查詢使用文件排序,最差的執行計劃
Using-Temporary:臨時表保存中間結果,比文件排序稍微強點
Using-Index:查詢操作中使用了覆蓋索引
Using-Where:表明使用了where過濾條件
Using-Join-Buffer:表明使用了連接緩存
Impossible-Where:表示where條件false,不能過濾元素
Distinct:優化distinct找到第一匹配的數據後即停止找同樣值的動作
Select-Tables-Optimized-Away:不必等到執行階段再進行計算,查詢執行計劃生成的階段即完成優化

三、B-Tree索引結構

1、B-Tree索引簡介

MySQL官方比較推薦的索引結構類型,在實際的資料庫開發中,基於MySQL中的表結構,大部分使用的都是B-Three索引結構,即二叉樹的結構。可以加快數據的訪問速度,存儲引擎不再需要進行全表掃描來獲取數據,數據分佈在各個索引節點上,B-Tree索引結構如圖:

該結構是典型的二叉樹結構,特點:數據值按照順序存儲的,每個葉子節點到根部的距離是相同的,註意這裡描述的是索引結構圖。

實際存儲結構上,數據順序存儲,每個節點包含索引值,索引指向的數據行的值,指向子頁的指針,指向葉子頁的指針,這樣才能把索引和數據結構組織起來,結構如圖:

這樣完整描述B-Tree索引的數據特點,基於樹搜索提升效率,減少掃描數據,數據被順序的組織起來,按照索引值順序排列。

2、搜索規則

索引的根本作用,減少掃描的數據量,提升查詢效率,基於B-Tree索引的結構的查詢規則基本如下:

  • 查詢從索引的根節點開始,逐步搜索;
  • 根節點的槽中存放指向子節點的指針,指向下層;
  • 根據節點頁的值和查詢值比較,判斷是否符合條件;
  • 不斷執行上述邏輯,直到查詢完成;

註意:必須要強調一點,查詢必須是在執行索引的基礎上,才是該邏輯,正常的開發中多分析一下查詢語句,有時候可能只是自己感覺查詢索引是執行的,實際可能是失效的。

3、索引查詢失效

好的索引設計十分重要,但是查詢的時候很可能因為觸發各種索引失效機制,導致SQL語句不執行索引搜索,嚴重損失性能,所以基於業務下數據查詢特點,設計相對好用的索引結構,是十分關鍵的,這裡涉及很多場景問題,後續再詳細記錄。

四、索引導致的問題

索引有時候並不是最好的解決方式,當數據量龐大的時候,索引也會占據龐大的存儲空間,這裡提供一個業務測試場景,僅供參數:單表三個字元類型欄位,兩個欄位使用索引結構,存儲數據在700W量級,在A和B兩個資料庫,A資料庫有索引結構,B資料庫沒有索引,A庫占用的空間是B庫的1.6倍,寫入千萬數據的速度也比B資料庫慢9分鐘。

這裡只想說明一點:索引雖然好,使用妥當才能發揮作用。

五、源代碼地址

GitHub·地址
https://github.com/cicadasmile/mysql-data-base
GitEE·地址
https://gitee.com/cicadasmile/mysql-data-base

推薦閱讀:MySQL系列

序號 文章標題
01 MySQL基礎:經典實用查詢案例,總結整理
02 MySQL基礎:從五個維度出發,審視表結構設計
03 MySQL基礎:系統和自定義函數總結,觸發器使用詳解
04 MySQL基礎:存儲過程和視圖,用法和特性詳解
05 MySQL基礎:邏輯架構圖解和InnoDB存儲引擎詳解
06 MySQL基礎:事務管理,鎖機制案例詳解
07 MySQL基礎:用戶和許可權管理,日誌體系簡介
08 MySQL進階:基於多個維度,分析伺服器性能

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在打開頁面時報錯:無法使用前導 .. 在頂級目錄上退出 原因:頂級目錄不能使用../ 經過查找,發現站點地圖裡出問題了 把../去掉後正常 或者在地址前加~/(表示應用程式的根目錄) ...
  • 一、WPF介紹 WPF全稱 Windows Presentation Foundation,幹啥用的? 主要是用來製作Windows桌面客戶端軟體的。 .Net平臺下製作Windows桌面客戶端軟體主要有兩個,一個Winform,還有一個就是WPF了。 事件驅動時代:開發客戶端便採用Winform, ...
  • 最近刷題倒是沒停,但是感覺大部分遇到的不是很適合拿來水博客,畢竟方法套路比較相似。年兄推薦下做了兩道首碼和的題,感覺這類題型的思路很棒,也可以歸納成一個方法,故再來水一篇。題目均來自力扣Leetcode,傳送門。 簡單來說,首碼和適合於解決 連續,求和 相關的問題。遇到的問題如果包含相關要求,可以考 ...
  • 一:背景 1. 講故事 最近也是奇怪,在社區里看到好幾篇文章聊static的玩法以及怎麼拿這個和麵試官扯半個小時,有點意思,點進去看都是java版的,這就沒意思了,怎麼也得有一篇和麵試官扯C#中的 static用法撒,既然沒有人開這個頭,那我就獻醜了。。。,下麵以QA的方式記述,大家可以代入一下能回 ...
  • SRAM大多是由CMOS管組成的揮發性靜態存儲器。在掉電後存儲器中所存數據就會丟失。隨機靜態存儲器可以對任何地址進行讀寫操作,通過鎖存器的原理對數據進行保存,在無操作狀況下,鎖存器處於穩態,保持數據穩定,不用進行周期性的電荷刷新。SRAM由基本單元構成的陣列以及外圍電路構成,其中陣列的劃分和外圍電路 ...
  • 摘自:https://www.cnblogs.com/zhuchenglin/p/8686924.html 1. /bin目錄 / b i n目錄包含了引導啟動所需的命令或普通用戶可能用的命令(可能在引導啟動後)。這些命令都是二進位文件的可執行程式( b i n是b i n a r y - -二進位 ...
  • docker-distribution搭建的倉庫非常簡陋,它甚至連一個用戶認證都沒有,更別提多用戶;今天我們來介紹另外一款docker倉庫工具harbor;harbor這款工具相對docker-distribution來講功能上豐富了許多;它支持多租戶,可擴展的API和web ui ,支持跨多個h... ...
  • 消失了一段時間,我又回來啦。不多說,繼續把哨兵看完。 檢測主觀下線狀態 預設情況下,Sentinel會以每秒一次的頻率向所有與他創建了命令連接的實例(主從伺服器以及其他Sentinel)發送PING命令,並通過實例返回的PING命令回覆來判斷實例是否線上。 實例對PING命令的回覆可以分為兩種情況: ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...