日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL进阶篇(02):索引体系划分,B-Tree结构说明

發(fā)布時間:2025/3/17 数据库 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL进阶篇(02):索引体系划分,B-Tree结构说明 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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

一、索引簡介

1、基本概念

首先要明確索引是什么:索引是一種數(shù)據(jù)結構,數(shù)據(jù)結構是計算機存儲、組織數(shù)據(jù)的方式,是指相互之間存在一種或多種特定關系的數(shù)據(jù)元素的集合,例如:鏈表,堆棧,隊列,二叉樹等等。

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

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

2、索引的優(yōu)點

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

3、索引分類

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

  • 產(chǎn)生作用:主鍵索引,普通索引,非空索引,全文索引;
  • 覆蓋字段:單列索引,組合索引;
  • 數(shù)據(jù)結構:B-Tree索引,哈希索引,R-Tree索引;

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

二、索引用法詳解

1、不同索引特點

普通索引

基本的索引,沒有任何使用限制,主要用來加速數(shù)據(jù)查詢。適合經(jīng)常出現(xiàn)在查詢條件或排序條件中的數(shù)據(jù)列。

主鍵索引

特殊的唯一索引,不允許有空值,在建表的時候指定主鍵,就會創(chuàng)建主鍵索引,MySQL中最核心的索引,大量的業(yè)務數(shù)據(jù)都是基于主鍵查詢。

唯一索引

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

全文索引

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

組合索引

創(chuàng)建的索引覆蓋兩個或者兩個以上的列,適應組合查詢的場景,也常用于要素驗證的業(yè)務,例如判斷用戶身份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 '創(chuàng)建時間',state INT (1) DEFAULT '1' COMMENT '是否可用,0-不可用,1-可用',PRIMARY KEY (`id`) ) ENGINE = INNODB DEFAULT CHARSET = utf8 COMMENT = '用戶基礎表';

創(chuàng)建單列索引

CREATE INDEX card_id_index ON user_base(card_id);

修改添加索引

ALTER TABLE user_base ADD INDEX state_index(state) ;

創(chuàng)建組合索引

CREATE INDEX bind_index ON user_base(phone,card_id);

刪除索引

DROP INDEX card_id_index ON user_base ;

修改索引

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

3、查詢索引

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

基礎用法

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

參數(shù)說明

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

三、B-Tree索引結構

1、B-Tree索引簡介

MySQL官方比較推薦的索引結構類型,在實際的數(shù)據(jù)庫開發(fā)中,基于MySQL中的表結構,大部分使用的都是B-Three索引結構,即二叉樹的結構??梢约涌鞌?shù)據(jù)的訪問速度,存儲引擎不再需要進行全表掃描來獲取數(shù)據(jù),數(shù)據(jù)分布在各個索引節(jié)點上,B-Tree索引結構如圖:

該結構是典型的二叉樹結構,特點:數(shù)據(jù)值按照順序存儲的,每個葉子節(jié)點到根部的距離是相同的,注意這里描述的是索引結構圖。

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

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

2、搜索規(guī)則

索引的根本作用,減少掃描的數(shù)據(jù)量,提升查詢效率,基于B-Tree索引的結構的查詢規(guī)則基本如下:

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

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

3、索引查詢失效

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

四、索引導致的問題

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

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

五、源代碼地址

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

推薦閱讀:MySQL系列

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

總結

以上是生活随笔為你收集整理的MySQL进阶篇(02):索引体系划分,B-Tree结构说明的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內容還不錯,歡迎將生活随笔推薦給好友。