自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MySQL 索引解析:讓查詢速度飆升的秘訣!

數(shù)據(jù)庫 MySQL
索引是數(shù)據(jù)庫中用于快速查找數(shù)據(jù)的機(jī)制,本質(zhì)是某種數(shù)據(jù)結(jié)構(gòu)。它存儲著指向數(shù)據(jù)的指針,從而幫助數(shù)據(jù)庫跳過不必要的行,直接定位到目標(biāo)數(shù)據(jù),減少掃描時(shí)間。

1.前言

這次小編準(zhǔn)備用兩篇文章來和大家分享下mysql innodb的索引: mysql的基礎(chǔ)知識 和 基于索引的sql優(yōu)化 。

2. 什么是索引?

定義:索引是數(shù)據(jù)庫中用于快速查找數(shù)據(jù)的機(jī)制,本質(zhì)是某種數(shù)據(jù)結(jié)構(gòu)。它存儲著指向數(shù)據(jù)的指針,從而幫助數(shù)據(jù)庫跳過不必要的行,直接定位到目標(biāo)數(shù)據(jù),減少掃描時(shí)間。

比如我們看<<三國演義>>劉備三顧茅廬這章,如果沒有目錄,我們就需要一篇一篇的翻書,要翻很久,因?yàn)椴恢涝跁哪囊豁?;但是如果有目錄,我們是不是先在目錄里面找到這章的目錄,這章的目錄對應(yīng)著正文的書頁,我們一下就可以翻到對應(yīng)的書頁,找到對應(yīng)的章節(jié)。目錄就類似于mysql的索引。

3. 為什么需要索引?

  • 加速查詢:索引可以顯著減少數(shù)據(jù)庫檢索所需的時(shí)間。沒有索引時(shí),數(shù)據(jù)庫會執(zhí)行全表掃描(讀取每一行),而索引讓數(shù)據(jù)庫只需要掃描部分?jǐn)?shù)據(jù)。
  • 降低 I/O 負(fù)載:索引通過減少物理讀取的次數(shù),從而減少 I/O 操作。在大型數(shù)據(jù)集上尤其明顯,特別是對于復(fù)雜查詢或多表連接(JOIN)的場景。
  • 常見應(yīng)用場景:索引在以下場景中最有用:

WHERE 子句中的條件過濾。

ORDER BY 語句進(jìn)行排序時(shí)。

GROUP BY 語句進(jìn)行分組時(shí)。

多表 JOIN 操作時(shí)匹配外鍵或其他相關(guān)列。

4. 索引的類型

  • 主鍵索引:主鍵是表中唯一標(biāo)識記錄的字段,通常自動創(chuàng)建索引。InnoDB 存儲引擎會將主鍵索引作為聚簇索引(Clustered Index),即數(shù)據(jù)的物理存儲順序和主鍵索引順序一致。
  • 唯一索引:保證索引列中的所有值唯一性,類似于主鍵索引,但可以應(yīng)用于非主鍵字段。
  • 普通索引:沒有唯一性要求的索引,用于加速查詢的非主鍵列。普通索引僅保證加速查找,沒有其他約束。
  • 聯(lián)合索引(復(fù)合索引):一個(gè)索引包含多個(gè)列,按照指定順序進(jìn)行索引。根據(jù)最左前綴原則,只要查詢的條件從左開始匹配列的順序,索引就可以生效。

5. 索引的結(jié)構(gòu)

  • B-Tree 索引:MySQL 中最常見的索引結(jié)構(gòu)是 B-Tree,特別是 InnoDB 存儲引擎。B-Tree 索引通過一種平衡樹結(jié)構(gòu),使得數(shù)據(jù)查找時(shí)間復(fù)雜度為 O(log n)。每個(gè)節(jié)點(diǎn)存儲鍵值,并且有指向下層節(jié)點(diǎn)的指針。查詢通過層次結(jié)構(gòu)逐級縮小搜索范圍,從而快速定位目標(biāo)數(shù)據(jù)。
  • 哈希索引:哈希索引基于哈希函數(shù),將鍵值映射為固定大小的哈希值。其特點(diǎn)是查詢效率極高(O(1) 時(shí)間復(fù)雜度),但只適用于精確匹配的查詢。不支持范圍查詢(例如 <、> 操作),因此哈希索引不適合大多數(shù)通用場景。

這里強(qiáng)調(diào)一下:innodb只能創(chuàng)建B-Tree 索引,不支持哈希索引。即使創(chuàng)建的時(shí)候選擇的是哈希,實(shí)際創(chuàng)建之后的結(jié)果也是B-Tree,有興趣的同學(xué)可以試試,小編這里就不截圖了。

下面,小編用六條數(shù)據(jù)模擬下索引的結(jié)構(gòu)。首先看下表結(jié)構(gòu):

圖片圖片

然后表里面的數(shù)據(jù):

圖片圖片

然后看下主鍵索引的結(jié)構(gòu),這里是小編根據(jù)索引的結(jié)構(gòu)自己畫的:

圖片圖片

根據(jù)這個(gè)B+ 樹索引結(jié)構(gòu)圖,小編簡單的說下:

  • 綠色: 綠色框框表示頁數(shù),之前已經(jīng)講過,數(shù)據(jù)庫的數(shù)據(jù)是以頁的方式存儲。
  • 紅色: 紅色框框表示是否是索引還是數(shù)據(jù)行,1:索引;0:數(shù)據(jù)。
  • B+樹的葉子節(jié)點(diǎn)存放的是完整的數(shù)據(jù),非葉子節(jié)點(diǎn)存放的是索引數(shù)據(jù)。
  • B+樹的子節(jié)點(diǎn)可以有多個(gè),這里是只用4條數(shù)據(jù)模擬,多了難得畫。
  • 葉子節(jié)點(diǎn)的數(shù)據(jù)是有序的,根據(jù)主鍵id由小到大存儲,并且行與行,頁與頁之間是用雙向鏈表連接的。

二級索引

除了主鍵外,我們會根據(jù)查詢的字段,也去建立相應(yīng)的字段索引。小編這里就不畫圖了,二級索引的葉子節(jié)點(diǎn)放的是對應(yīng)的主鍵索引值。

回表

指的是 MySQL 在通過二級索引查找到符合條件的記錄后,還需要回到主鍵索引中去讀取額外的列數(shù)據(jù)。因?yàn)樗饕话糠至械男畔?,如果查詢中請求了索引中未包含的列,?shù)據(jù)庫就需要從主鍵索引中再次讀取完整的行數(shù)據(jù)。

比如user表中,我給name添加索引,我需要查詢name=小九這行數(shù)據(jù)的信息,因?yàn)槎壦饕菦]有完整的數(shù)據(jù),所以mysql需要去主鍵索引里面找到對應(yīng)的完整數(shù)據(jù)返回。

覆蓋索引

指的是當(dāng)一個(gè)索引完全包含了查詢所需的所有列時(shí),MySQL 不需要再回表,而是直接從索引中就可以返回結(jié)果。這種情況就稱為覆蓋索引。

比如user表中,我給name添加索引,我需要查詢name=小九這條數(shù)據(jù)的id,因?yàn)閕d在葉子節(jié)點(diǎn)已經(jīng)有了,直接就返回了結(jié)果,不需要去主鍵索引再次查詢。

覆蓋索引的優(yōu)勢:

性能提升:避免了回表,降低了 I/O 和查詢時(shí)間。減少表掃描:索引的存儲比表的數(shù)據(jù)量小得多,索引掃描比全表掃描快。

6. 總結(jié)

  • 索引是提升查詢性能的關(guān)鍵工具,選擇合適的索引類型和合理優(yōu)化可以極大提高數(shù)據(jù)庫效率。
  • 理解索引的類型和底層原理能夠幫助開發(fā)者在構(gòu)建數(shù)據(jù)庫時(shí)做出明智的決策。
責(zé)任編輯:武曉燕 來源: Java極客技術(shù)
相關(guān)推薦

2009-05-12 13:10:22

OracleMySQLSELECT

2015-11-06 14:40:41

網(wǎng)速wifi

2011-08-15 18:20:05

建立索引SQL Sever數(shù)據(jù)

2011-08-16 13:27:34

索引

2011-05-16 17:31:18

2018-07-11 20:07:06

數(shù)據(jù)庫MySQL索引優(yōu)化

2020-09-07 10:23:01

MySQL索引查詢

2025-03-17 03:00:00

C#性能并行處理

2010-08-27 11:00:05

秘訣

2024-09-25 08:00:00

Python文件處理

2015-07-13 17:30:38

慕慕

2024-11-27 09:46:34

2025-01-15 12:48:30

2021-10-12 07:58:10

MySQL索引數(shù)據(jù)

2025-03-31 00:45:00

2017-05-10 16:09:12

MySQL數(shù)據(jù)庫查詢

2015-07-15 17:39:18

2021-05-19 14:45:07

電腦軟件工具

2020-06-05 09:52:43

IT部門高管首席信息官

2025-02-10 10:59:52

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號