成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

MySQL 索引數據結構解析

運維 數據庫運維
索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。

[[428230]]

本文轉載自微信公眾號「運維開發故事」,作者老鄭。轉載本文請聯系運維開發故事公眾號。

概述

索引是對數據庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問數據庫表中的特定信息。

索引數據結構

二叉樹

二叉樹(binary tree)是指樹中節點的度不大于 2 的有序樹,它是一種最簡單且最重要的樹。二叉樹的遞歸定義為:二叉樹是一棵空樹,或者是一棵由一個根節點和兩棵互不相交的,分別稱作根的左子樹和右子樹組成的非空樹;左子樹和右子樹又同樣都是二叉樹

對于數組 {1,2,3,4,5} 數據結構將成為了鏈表

特點:

  • 父節點下面有兩個子節點。
  • 右邊節點的數據大于左邊節點的數據。

二叉樹.png

紅黑樹

紅黑樹是一種特定類型的二叉樹,它是在計算機科學中用來組織數據比如數字的塊的一種結構。若一棵二叉查找樹是紅黑樹,則它的任一子樹必為紅黑樹。

紅黑樹是一種平衡二叉查找樹的變體,它的左右子樹高差有可能大于 1,所以紅黑樹不是嚴格意義上的平衡二叉樹(AVL),但對之進行平衡的代價較低, 其平均統計性能要強于 AVL 。

由于每一棵紅黑樹都是一棵二叉排序樹,因此,在對紅黑樹進行查找時,可以采用運用于普通二叉排序樹上的查找算法,在查找過程中不需要顏色信息。

紅黑樹數據結構如下圖:

紅黑樹數據結構.png

特點:

  • 紅黑樹是每個結點都帶有顏色屬性的二叉查找樹,顏色或紅色或黑色。
  • 結點是紅色或黑色。
  • 根結點是黑色。
  • 所有葉子都是黑色。(葉子是NIL結點)
  • 每個紅色結點的兩個子結點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色結點)
  • 從任一節結點其每個葉子的所有路徑都包含相同數目的黑色結點。
  • 這些約束強制了紅黑樹的關鍵性質: 從根到葉子的最長的可能路徑不多于最短的可能路徑的兩倍長。結果是這個樹大致上是平衡的。因為操作比如插入、刪除和查找某個值的最壞情況時間都要求與樹的高度成比例,這個在高度上的理論上限允許紅黑樹在最壞情況下都是高效的,而不同于普通的二叉查找樹。
  • 是性質4導致路徑上不能有兩個連續的紅色結點確保了這個結果。最短的可能路徑都是黑色結點,最長的可能路徑有交替的紅色和黑色結點。因為根據性質5所有最長的路徑都有相同數目的黑色結點,這就表明了沒有路徑能多于任何其他路徑的兩倍長。
  • 因為紅黑樹是一種特化的二叉查找樹,所以紅黑樹上的只讀操作與普通二叉查找樹相同。

B-Tree

  • 葉子結點具有相同的深度,葉節點的指針為空
  • 所有元素不重復
  • 節點中的數據索引從左到右邊遞增排列

B樹數據結構.png

B+Tree

非葉子結點不存儲數據,只存儲索引(冗余),可以存放更多的索引

葉子結點包含所有索引字段

葉子結點用指針鏈接,提高區間訪問的性能(可以提升范圍查找的效率)

B+樹數據結構.png

特點關鍵字:節點內有序,葉子結點指針鏈接,非葉子結點存儲索引(冗余)

查詢mysql 索引的數據頁的大小:

  1. mysql> show global status like 'Innodb_page_size'
  2. +------------------+-------+ 
  3. | Variable_name    | Value | 
  4. +------------------+-------+ 
  5. | Innodb_page_size | 16384 | 
  6. +------------------+-------+ 

為什么設置 16kb 呢?

Hash

  • 對索引的 key 進行一次 hash 計算就可以定位出數據存儲的位置
  • 很多的時候 hash 索引要比 B+ 樹索引更高效
  • 僅能滿足 “=” , “in” 不支持范圍查詢
  • 存在 hash 沖突問題

Hash 數據結構.png

索引

InnoDB 索引實現(聚集)

  • 表數據文件本身就是按 B+Tree 組織的一個索引結構文件
  • 聚集索引-葉子節點包含了完整的數據記錄
  • 為什么 InnoDb 表必須有主鍵,并且推薦使用整型的自增主鍵?
    • 如果沒有設置索引的話,MySQL 會選擇一個數據唯一的列作為主鍵索引, 如果找不這樣的列。會去做創建一個隱藏列類似 rowid。
    • 表數據文件按照 B+Tree 的數據結構維護,在葉子節點維護的是該行的數據。所以必須有主鍵。
    • 整型更方便 B+Tree 排序,自增的話,對于數據結構的存放更快, 順序存放,不需要進行大量樹的平衡操作。
  • 為什么非主鍵索引結構葉子節點的存儲的是主鍵值?
    • 一致性, 讓主鍵索引先成功,然后再去更新非主鍵索引關系
    • 節省存儲空間。
  • 主鍵索引示意圖:

InnoDB 索引實現.png

  • 非主鍵索引示意圖

如果查詢的是通過 name = Alice 去查詢的時候:

  1. 走非主鍵索引去查詢,查詢完后拿到信息(Alice, 18)。其實這里也是一個非聚簇索引
  2. 然后進行回表查詢,再次通過主鍵去查詢做回表查詢。

兩個數據文件:

.frm 主要是存儲表結構信息

.ibd 主要是存儲索引和數據

MyISAM 索引文件(非聚集)

  • 索引文件和數據文件是分離的(非聚集)

MyISAM 存儲引擎索引.png

三個數據文件:

.frm 數據結構文件

.myd 文件主要是存儲數據

.myi 文件主要是存儲索引信息

聚集索引和非聚集索引

特征:

聚集/非聚集主要是索引文件是否和數據文件在一起。

查詢效率上來說聚集索引不會跨文件查詢效率會更加快。

聯合/復合索引

多個字段組織成一個共同的索引

組合索引.png

  • 最左前綴原理為什么這樣來使用?

索引的數據是被排序的,如果跳過字段的話是無法被使用的。

示例:

where name = 'Jeff' and age = 22 -- 命中索引

where age = 30 and postatin='manager' -- 不命中索引

where postation = 'dev' -- 不命中索引

參考資料

百度百科

 

責任編輯:武曉燕 來源: 運維開發故事
相關推薦

2023-04-12 16:45:07

MySQL索引數據結構

2023-06-08 07:25:56

數據庫索引數據結構

2011-07-11 15:03:36

MySQL索引數據結構

2011-07-11 16:05:42

MySQL索引

2023-04-28 08:53:09

2023-12-28 10:54:58

MySQL記錄存儲

2011-07-11 13:11:54

MySQL索引數據結構

2017-08-31 09:45:43

JavaArrayList數據

2023-09-15 10:33:41

算法數據結構

2010-06-09 15:04:12

2017-05-11 11:59:12

MySQL數據結構算法原理

2023-10-31 08:51:25

數據結構存儲數據

2012-04-28 14:21:47

Java數據結構線性結構

2011-03-31 15:41:51

Cacti數據表結構

2017-10-10 16:59:28

Java數據結構算法解析

2023-09-05 10:16:02

Java框架

2020-10-21 14:57:04

數據結構算法圖形

2021-05-12 14:09:35

鏈表數據結構線性結構

2011-04-06 08:54:28

CactiRRD

2023-11-12 21:49:10

Redis數據庫
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 五月天婷婷综合 | 九九热免费视频在线观看 | 免费毛片网站 | 国产精品成人一区二区 | 成人国产在线视频 | 国产日韩欧美一区 | 久久综合入口 | 精品久久久久久国产 | 亚洲午夜精品一区二区三区他趣 | 欧美成年人视频在线观看 | 亚洲国产精品一区二区第一页 | 一区二区三区在线观看视频 | 欧美九九 | 日本午夜在线视频 | 久久不卡| 日日摸日日添日日躁av | 一区二区三区精品视频 | 国产综合精品 | 最新av在线播放 | 一区二区三区电影在线观看 | 第四色播日韩第一页 | 国产精品久久久久久久久久 | 亚洲一区二区三区视频在线 | 久久51| 天天干视频 | 日本视频一区二区三区 | 成人免费av| 综合色久| 精品一区视频 | a在线视频 | 亚洲三级在线 | 国产福利精品一区 | 日日做夜夜爽毛片麻豆 | 国产美女特级嫩嫩嫩bbb片 | 久久99精品久久久久久秒播九色 | 午夜av免费 | 久久999| 日本 欧美 国产 | 国产日本精品视频 | 人人人人干 | 一区二区三区视频 |