【MySQL】第九彈——索引(下)

文章目錄

  • 🌏索引(上)回顧
  • 🌏使用索引
    • 🪐自動創建索引
    • 🪐手動創建索引
      • 🚀主鍵索引
      • 🚀普通索引
      • 🚀唯一索引
      • 🚀復合索引
    • 🪐查看索引
    • 🪐刪除索引
      • 🚀刪除主鍵索引
      • 🚀刪除其他索引
  • 🌏查看執行計劃

🌏索引(上)回顧

  1. MySQL選擇使用B+樹這種數據結構進行索引

可以有效的控制樹高
非葉子節點僅具有索引功能,葉子結點保存真實數據
所有葉子結點構成一個有序鏈表 實現范圍查找

  1. B+樹與B樹對比

葉子結點中的數據連續,相互連接,便于區間查找和搜索
非葉子結點的值都包含在葉子結點中
樹高相同的情況下,查找任一元素時間復雜度都一樣,性能均衡

  1. 頁是內存與磁盤交互的最小單元,默認大小為16KB

讀取數據時,不是單單讀取一條數據,而是讀取一整頁查遍歷到相應的數據行
空間不夠了 InooDB會提前申請好一頁的空間,所以頁的磁盤空間是連續的,便于數據的遍歷

  1. B+樹在MySQL索引中的應用
    在這里插入圖片描述

比如查找id 為 6的數據行

現在遍歷槽1 通過槽拿到主鍵值進行判斷, 能看到圖中槽1的主鍵值是4 5 > 4 就到槽2中遍歷
槽2 中存在主鍵值為6 的值
先比對槽中記錄的主鍵值,定位到最后?個槽2,再從最后?個槽中的第?條記錄遍歷,第?條記錄就是我們要查詢的目標行

想要查詢頁里面的內容,先將頁加載到內存,根節點一頁,二級節點一頁,葉子結點的數據頁也是一頁,所以說通過三次IO就可以把我們想要的數據找到 --三層樹高的B+樹

  1. 三層樹高的B+樹可以存多少記錄

一個數據頁默認為16KB。假設一條數據為1KB,一頁中至多可以存16條數據
索引頁中存的是主鍵值和子節點的引用,也就是說下一個節點的偏移(地址)
主鍵 bigint類型 占8Byte 下一頁地址 6Byte 也就是說一條索引記錄占 8 + 6 = 14Byte
一個索引頁可以存 16 * 1024 / 14 = 1170
理論上一個三層樹高的B+樹可以存:1170 * 1170 * 16 = 21,902,400 條記錄
在當前的場景下,表中有21,902,400條記錄的情況下,通過3次IO就可以完成數據的查詢

  1. 索引分類

創建索引之前考慮需不需要創建索引,創建一個索引就會生成一個索引樹占磁盤空間,對數據的增刪改效率影響較大
如果某一列的重復度過高,像是gender 這種只有兩個值的列 數據一多,重復度就會很高,就非常不適合創建索引來提高查詢效率
如果要存儲文檔類的數據,我們會專門使用文檔類的數據庫,全文索引用的并不多

🌏使用索引

🪐自動創建索引

  • 當我們為一張表加主鍵約束(PRIMARY KEY),外鍵約束(FOREIGN KEY),唯一約束(UNIQUE)時,MySQL會為對應的列自動創建一個索引
  • 如果表中不指定任何約束,MySQL會自動為每一列生成一個索引并用ROW_ID字段進行標識

🪐手動創建索引

🚀主鍵索引

  1. 方式一:創建表時指定主鍵

在這里插入圖片描述

-- 創建表的時候指定主鍵
create table t_pk1(id bigint PRIMARY KEY auto_increment,name varchar(20)
);
desc t_pk1;
  1. 創建表時單獨指定主鍵列
    在這里插入圖片描述
-- 創建表時單獨指定主鍵列
create table t_pk2(id bigint auto_increment,name varchar(20),PRIMARY KEY (id)
);
show index from t_pk2;
  1. 方式三:修改表中的列為主鍵索引

修改表結構和列語法:

alter table 表名 [add | modify | drop] 要修改的內容

在這里插入圖片描述

🚀普通索引

創建的時機:
1.創建表的時候,明確的知道某些列需要頻繁查詢,就創建好
(當表中數據過少時,全表掃描效率可能比索引還高)
2.隨著業務的不斷發展,在版本迭代的過程中會添加索引

1.方式一:創建表時指定索引列

在這里插入圖片描述

create table t_index1(id bigint PRIMARY KEY auto_increment,name varchar(20) UNIQUE,sno varchar(20),index (sno)
);desc t_index1;
或者使用show keys from 表名

查看關系
在這里插入圖片描述
2. 方式二:修改表中的列為普通索引列
在這里插入圖片描述

create table t_index2(id bigint PRIMARY KEY auto_increment,name varchar(20) UNIQUE,sno varchar(20)
);
alter  table t_index2 add index (sno);
desc t_index2;
  1. 方式三:單獨創建索引并指定索引名
    在這里插入圖片描述
create table t_index3(id bigint PRIMARY KEY auto_increment,name varchar(20) UNIQUE,sno varchar(20)
);create index idx_t_index3_sno on t_index3 (sno); 
desc t_index3;
show keys from t_index3;

🚀唯一索引

  1. 方式一:創建表時指定索引列
create table t_test_index (id bigint primary key auto_increment,name varchar(20) uniquesno varchar(10),index(sno)
);
  1. 方式二:修改表中的列為普通索引
create table t_test_index1 (id bigint primary key auto_increment,name varchar(20),sno varchar(10)
);
alter table t_test_index1 add index (sno) ;
  1. 方式三:單獨創建索引并指定索引名
create table t_test_index2 (id bigint primary key auto_increment,name varchar(20),sno varchar(10)
);
create index index_name on t_test_index2(sno);

使用create index 創建索引

在這里插入圖片描述

🚀復合索引

索引中包含多個列
創建語法和創建普通索引的方式相同,只不過指定多個列,列與列之間用逗號隔開

  1. 方式一:創建表時指定索引列
    在這里插入圖片描述
create table t_index4(id bigint PRIMARY KEY auto_increment,name varchar(20),sno varchar(20),class_id bigint,index(sno,name)
);
  1. 方式二:修改表中的列為復合索引
    在這里插入圖片描述
create table t_index5 (id bigint primary key auto_increment,name varchar(20),sno varchar(10),class_id bigint
);
alter table t_index5 add index (sno, class_id);
  1. 方式三:單獨創建索引并指定索引名
    在這里插入圖片描述
create table t_index6 (id bigint primary key auto_increment,name varchar(20),sno varchar(10),class_id bigint
);
create index id_t_index6_sno_name on t_index6 (sno,name);

🪐查看索引

  1. 方式一:show keys from 表名\G;
    在這里插入圖片描述

  2. 方式二: show index from 表名;
    在這里插入圖片描述

  3. 方式三:簡要信息 desc 表名;
    在這里插入圖片描述

🪐刪除索引

🚀刪除主鍵索引

語法:

alter table 表名 drop  primary key ;

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

🚀刪除其他索引

語法:

alter table 表名 drop index 索引名;

在這里插入圖片描述

🌏查看執行計劃

怎么查看自己寫的SQL走沒走索引?
–查看執行計劃

  • 先為學生表創建一個索引(復合索引)

在這里插入圖片描述

  • 1.不加條件,查詢所有(全表掃描)
    在這里插入圖片描述
  • 2.使用主鍵查詢
    在這里插入圖片描述
    1. 子查詢中使用索引
      在這里插入圖片描述

type類型:
在這里插入圖片描述

  • 4.使用普通索引
    在這里插入圖片描述

  • 5.使用復合索引

回表查詢
在這里插入圖片描述

索引覆蓋
在這里插入圖片描述
在這里插入圖片描述

Extra: 執行情況的說明和描述,包含不適合在其他列中顯示但十分重要的額外信息。
1.Using index: 表示使用索引,如果只有Using index,說明他沒有查詢到數據表,只用索引表就完成了這個查詢,這個叫覆蓋索引
2.Using where: 表示條件查詢,如果不讀取表的所有數據,或不是僅僅通過索引就可以獲取所有需要的數據,則會出現Using where。

在這里插入圖片描述

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

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

相關文章

畢業論文格式(Word)

目錄 Word目錄怎么自動生成?快速生成試試這3個方法! - 知乎https://zhuanlan.zhihu.com/p/692056836目錄生成需要先設置標題樣式,這個不僅是目錄生成需要,和后續的圖表也有關系。 最好不要自己創建新的樣式,而是在現有…

PostGIS實現柵格數據轉二進制應用實踐【ST_AsBinary】

ST_AsBinary解析與應用實踐(同ST_AsWKB) 一、函數概述二、核心參數解析三、典型用法示例四、Out-DB 波段處理機制五、二進制格式與其他格式的轉換六、性能與存儲優化七、應用場景八、注意事項九、擴展應用:基于Python Web的柵格二進制數據的…

線性回歸原理推導與應用(七):邏輯回歸原理與公式推導

邏輯回歸是一種分類算法,常用于二分類,也就是得出的結果為是和不是,例如通過各種因素判斷一個人是否生病,信用卡是否違約等。邏輯回歸在社會和自然科學中應用非常廣泛, 前置知識 線性回歸 邏輯回歸的底層方法就是線…

Fastrace:Rust 中分布式追蹤的現代化方案

原文鏈接:Fastrace: A Modern Approach to Distributed Tracing in Rust | FastLabs / Blog 摘要 在微服務架構中,分布式追蹤對于理解應用程序的行為至關重要。雖然 tokio-rs/tracing 在 Rust 中被廣泛使用,但它存在一些顯著的挑戰&#xf…

水果系列數據集- 葡萄grapes>> DataBall

該數據集可以用于目標檢測,水果分類 ,文生圖相關項目。 以下是圖片樣例:

HTTP協議接口三種測試方法之-postman

HTTP協議作為現代Web開發的基石,其接口測試是開發過程中不可或缺的環節。Postman作為最流行的API測試工具之一,能夠極大提升我們的測試效率。本文將詳細介紹如何使用Postman進行HTTP接口測試。 一、HTTP協議基礎回顧 在開始使用Postman之前&#xff0c…

佰力博科技與您探討半導體電阻測試常用的一些方法

一、兩探針法? 兩探針法是一種較為基礎的測試方法。該方法將兩根探針與半導體樣品表面緊密接觸,通過電源在兩根探針之間施加電壓,同時使用電流表測量通過樣品的電流,再根據歐姆定律計算電阻。?這種方法的優點在于操作簡單、設備要求較低&a…

機器學習的一些基本概念

看了b站一個清華博士的視頻做的筆記,對于人工智能的底層原理,訓練方式,以及生成式文本輸出,圖片生成的底層原理有了一個了解,算是一個還不錯的科普文。之前一直想要了解一下機器學習的入門原理,神經網絡相關…

Python爬蟲實戰:研究Grab 框架相關技術

1. 引言 1.1 研究背景與意義 隨著互聯網的快速發展,網絡上的數據量呈爆炸式增長。如何高效地獲取和利用這些數據成為了當前的研究熱點。網絡爬蟲作為一種自動獲取網頁內容的技術,能夠按照一定的規則,自動地抓取萬維網信息,在搜索引擎、數據挖掘、信息整合等領域有著廣泛的…

uniapp 嵌入鴻蒙原生組件 具體步驟

關于怎么使用uniapp 嵌入鴻蒙原生組件 HBuilder X 版本 4.64 app-harmony文件下新建 index.uts button.ets button.ets里面復制uniapp 官方提供的 示例代碼 https://uniapp.dcloud.net.cn/tutorial/harmony/native-component.html button.ets import { NativeEmbedBuilderO…

阿里云 OS Copilot 使用指南

安裝: AlibabaCloudLinux: sudo yum install -y os-copilotUbuntu: curl -#S https://mirrors.aliyun.com/os-copilot/os-copilot-all-in-one-latest.sh | bash添加RAM用戶 打開 https://ram.console.aliyun.com/users 復制AccessKey,Ac…

枚舉類擴充處理

問題背景 由于 Java 不允許枚舉繼承另一個枚舉(enum cannot extend enum),但可以通過 組合方式 或 工具類 來實現類似功能。 ? 解決方案一:組合方式引入原始枚舉值 示例代碼: public enum CustomErrorCodeEnum imp…

Spring Security探索與應用

Spring Security核心概念 框架定位與核心能力 Spring Security是Spring生態中實現應用級安全的核心框架,其官方定義為"強大且高度可定制的認證與訪問控制框架"。作為Spring應用程序安全防護的事實標準解決方案,它通過模塊化設計提供以下核心能力: 認證(Authenti…

藍橋杯國14 不完整的算式

!!!!!!!!!!!!!!!理清思路 然后一步步寫 問題描述 小藍在黑板上寫了一個形如 AopBC 的算式&#x…

掃描電鏡:打開微觀世界的“超維相機“

當你用手機拍攝一朵花的微距照片時,放大100倍已足夠驚艷。但如果告訴你,科學家手中的"相機"能將物體放大百萬倍,連病毒表面的蛋白突觸都清晰可見,你是否會好奇這背后的黑科技?這把打開微觀宇宙的鑰匙&#x…

JVM學習(四)--對象內存布局

目錄 一、對象內存布局 1、對象的實例化 1.1、你有幾種方式創建對象? 1.2、創建對象的步驟 1.2.1、從字節碼角度看待對象創建過程 1.2.2、從執行步驟角度分析 2、對象的內存布局 2.1、對象頭 2.2、實例數據 2.3、對齊填充 3、對象的訪問定位 3.1、句柄訪…

SQL每日一題(4)

前言:第四更 雖然已經全部做完了,這套卷子非常推薦! 根據題目還原出來的原始表 employees表 idnameagestatus1張三28在崗2李四35在崗3王五42在崗4趙六NULL在崗5錢七58在崗6孫八24在崗7周九31離職8吳十-5在崗9鄭十一45在崗10王十二52在崗 題…

如何做好一份技術文檔?

文章目錄 前言一、技術文檔的核心原則二、技術文檔的類型與場景三、技術文檔的寫作流程3.1 需求分析階段(文檔生產的基礎)3.2 架構設計階段(文檔的骨架搭建)3.3 內容開發階段(血肉填充)3.4 質量保障階段&am…

怎么判斷一個Android APP使用了KMM這個跨端框架

要判斷一個 Android 應用是否使用了 KMM(Kotlin Multiplatform Mobile) 框架,可以通過以下方法逐步驗證: 一、安裝包結構分析 解壓 APK 將 .apk 文件重命名為 .zip 并解壓,檢查以下特征: ? kotlin/ 目錄&a…

Axure系統原型設計列表版方案

列表頁面是眾多系統的核心組成部分,承擔著數據呈現與基礎交互的重要任務。一個優秀的列表版設計,能夠極大提升用戶獲取信息的效率,優化操作體驗。下面,我們將結合一系列精心設計的列表版方案圖片,深入探討如何打造出實…