mysql多少資料用索引 MySQL資料庫索引詳解

2021-10-17 20:13:13 字數 3488 閱讀 9559

目標

1、索引資料紅黑樹、hash、b+樹詳解

2、千萬級資料表如何用索引快速查詢

3、如何基於索引b+樹準確建立高效能索引

4、聯合索引底層資料結構是怎樣的

5、聚集索引與覆蓋索引

6、mysql的最左字首原則

7、為什麼推薦使用自增主鍵做索引

8、mysql索引優化規則

索引的本質

按照官方的定義,索引就是按使用者任意指定的字段對資料進行排序的一種資料結構。

使用innodb儲存引擎時,在插入資料的時候,會自動把字段排好序(聚集);

而用myisam儲存引擎時,預設按插入資料的順序進行儲存,不會排序(堆表)。

索引的資料結構

二叉樹紅黑樹

hash表

b-tree

假如現在有乙個2列7行的表,如下圖:

按照不同的資料結構生成的索引也是不同的,比如:

下面是以 col2 欄位建的索引:

二叉樹二叉樹的特點就是: 它右邊的子元素是大於等於它的父元素,而左邊的子元素是小於它的父元素的。

缺點:如果是插入了有小到大一次遞增的索引是,資料結構就變成了鍊錶了。結果就是建了索引跟沒建一樣,走的就是全表掃瞄。

紅黑樹紅黑樹的本質是乙個二叉平衡樹,當樹一邊鍊錶太長的時候,它會自動平衡。

缺點: 樹的高度太高,查詢的次數多。

hash表

hash演算法算出字段的hash值,然後把hash值跟磁碟資料列位址指標做高速對映。

hash在等值查詢的時候,效能是非常不錯,但是在範圍查詢的時候效率就不行了。因為還是得挨個遍歷出來。

b tree

頁子節點具有相同的深度,頁節點的指標為空

所有索引元素不重複

節點中的資料索引從左到右遞增排列

缺點:沒有雙向指標,範圍查詢的時候不如b+樹。而且,b樹的葉子節點儲存了data,這樣整個樹在高度h<=3時儲存的索引少了很多。

b+tree

非頁子節點不儲存資料(data),只儲存索引(冗餘),可以放更多的索引。

頁子節點包含所有索引字段。

頁子節點用指標連線,提高區間訪問效能。

現在來看一下b+樹,可以存放多少索引元素:

mysql中儲存資料的單位是頁,跟作業系統類似,只不過作業系統中的大小為4kb,而mysql的頁的大小是16kb。

假設圖中的索引是乙個bigint型別的主鍵索引,bigint型別佔8位,也就是說乙個索引資料是8b,而圖中的空白元素實際上是指下乙個子節點的磁碟檔案位址,預設佔6b。這樣計算一下: 16kb/(8+6) = 1170。也就是說乙個頁大概可儲存1170個索引。這是樹第一層非葉子節點,可以存這麼多。第二層也是非葉子節點,同理可算: 1170 x 1170 = 1368900。可以儲存1368900個索引。第三層則是頁子節點,它沒有下一層,但是每乙個索引下面會有乙個data,這個data有可能是索引所在行的磁碟檔案位址,有可能是索引所在行的其他列的資料。這個不同的儲存引擎,放的東西是不一樣的。現在假設這個data裡放的是索引所在行的其他字段資訊,這樣它佔的空間比較大,所以假設索引+data為1kb的大小,這樣,每個頁就有16個索引,所以總共可以放:1170x 1170 x 16 = 21902400 個索引。 這個數量級完全夠我們用的,所以mysql採用b+樹這種資料結構來儲存索引。

b+樹的根節點是放在記憶體的,索引在sql查詢的時候,如果樹的高度h=3,最多也只會進行2次磁碟io。

myisam儲存引擎

myisam索引檔案和資料檔案是分離的。(非聚集)

檢視mysql檔案儲存位置:

myisam儲存引擎,在磁碟上對應有3個檔案: xx.frm、xx.myd、xx.myi 檔案,沒有截圖就不放了。

下面看看對應的邏輯圖:

假設col1是索引字段,那麼圖中,上部分b+樹結構資料就是放在 xx.myi 檔案裡,而下面的表一條一條資料就是放在 xx.myd 檔案中的。

innodb儲存引擎

innodb索引檔案和資料是在一起的,存在於乙個檔案中。(聚集)

表資料檔案本身就是按照b+樹組織的乙個索引結構檔案

聚集索引葉子節點包含了完整的資料記錄

為什麼innodb表必須要有主鍵,並且推薦整形自增主鍵

答:①、innodb規定是按照主鍵索引把資料組織起來的,如果沒有顯式定義主鍵的話,mysql會預設查詢表中的字段,看有沒有唯一性的字段。如果有,那麼就把它作為主鍵。如果沒有唯一性的字段,那麼mysql會隱式的建立乙個字段(rowid)自增的整形,來作為主鍵索引。

答:②、1、使用整形的自增,很簡單如果不是整形的話,比如說uuid,那麼uuid這種字串進行比較(ascii碼)大小,肯定沒有整形的資料(1<2)這種效率高。2、而且使用整形比uuid更省空間。3、自增的話就保證每次插入資料都在後面插入,因為b+樹要求葉子節點的資料要從左到右一次遞增的。(不自增的話,可能插入的資料在前面,會導致葉子節點**,然後做一次平衡,效能和效率會降低)

為什麼非主鍵索引結構葉子節點儲存的是主鍵值(一致性和節省儲存空間)

聚集索引一般都要比非聚集索引查詢效率要高,因為聚集索引(聚簇索引)只需要查乙個檔案而非聚集索引(稀疏索引)要查2個檔案(.myi和.myd)

聯合索引

多個字段組成聯合索引。聯合索引的底層儲存結構是什麼樣的?

上圖是由3個字段組成的聯合索引。而且,不管是單值索引還是聯合索引,它的葉子節點都是從左到右遞增排好序的。所以它的順序是按照(a,b,c)欄位的先後順序排的。

最左字首原則

如果索引是由多個字段組成的聯合索引,要遵循最左字首原則。也就是:查詢要從索引的最左前列開始並且不跳過索引中的列。

mysql有多大記憶體?能存多少資料?

mysql mysql 3.22 限制的表大小為4gb。myisam 儲存引擎 最大表尺寸增加到了65536tb 2567 1位元組 由於允許的表尺寸更大,mysql資料庫的最大有效表尺寸通常是由作業系統對檔案大小的限制決定的,而不是由mysql內部限制決定的。innodb 儲存引擎 innodb ...

char varchar最多可存放多少資料

char varchar最多能儲存8000個英文,4000個漢字 所以在design的時候應該盡量使用nvarchar來儲存資料 只有在你確保該欄位不會儲存中文的時候,才採用varchar來儲存 1 char。char儲存定長資料很方便,char欄位上的索引效率級高,比如定義char 10 那麼不論...

mysql索引框架 MySQL架構和MySQL索引

1.mysql架構 1.1邏輯架構圖 1.1.1connection pool 連線池 管理緩衝使用者連線,執行緒處理等需要快取的需求。負責監聽對mysql server的各種請求,接收連線請求,所有連線請求到執行緒管理模組。每乙個連線上mysql server的客戶端請求都會被分配 或建立 乙個連...