mysql 索引 二 2 MySQL索引

2021-10-22 04:51:00 字數 2595 閱讀 3847

一、索引介紹

索引是一種資料結構,用於幫助我們在大量資料中快速定位到我們想要查詢的資料。

索引在mysql中也叫做「鍵」,是儲存引擎用於快速找到記錄的一種資料結構。索引對於良好的效能非常關鍵,尤其是當表中的資料量越來越大時,索引對於效能的影響愈發重要。索引優化應該是對查詢效能優化最有效的手段了。索引能夠輕易將查詢效能提高好幾個數量級。

二、為啥要使用索引

如上圖,是mysql中一張表t的2列資料,現在要找出col2 = 89 的資料,select * from t where col2 = 89; 此時如果沒有索引的話,就得對比6次,才可以找到。這樣效率太低,索引就得使用索引。

三、索引分類

索引在 mysql 資料庫中分三類:(1)二叉樹。(2)紅黑樹。(3)b-tree索引。(4)b+tree索引。(5)hash索引。(6)全文索引。但其實mysql真正用的的索引的資料結構是:b+tree。下面說一下各種索引的特點。

1、二叉樹

對於上面的那個例子,當時有二叉樹以後,情況如下,二叉樹是以key-value儲存,key儲存的是索引值,value儲存的是索引值所在行的磁碟位址(檔案指標),比如還是找索引值(也就是key)是89,首先89和34比較,往右子節點走,89和89比較,找到了,此時就會去讀value,讀出value為0x77,然後再根據位址0x77去資料庫的資料檔案拿到相應的值。

二叉樹的缺點:如果以col1作為索引字段,此時往資料庫中插入資料如下:

此時資料在磁碟檔案中以鍊錶的形式儲存了,當在查詢6時,就還是會比較6次,相當麻煩。所以不用二叉樹。

2、紅黑樹

遇到二叉樹解決不了的問題,我們就會想到紅黑樹(平衡二叉樹,也叫做val),此時再次插入7個值時,此時結構如下:此時看似解決了上面的問題。

紅黑樹的缺點:當一張表中有1百萬甚至1千萬條記錄時,此時樹的高度就得20~30,此時如果索引欄位是字串,這時如果查詢的話,最壞的情況就是得字串做20~30次得比較,這也比較耗時。

3、b-tree

b-tree的特點:

(1)葉節點具有相同的深度,葉節點的指標為空。

(2)所有索引元素不重複。

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

4、b+tree

b+tree的特點:

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

(2)葉子節點包含所有索引字段。

(3)葉子節點用指標連線,提高區間訪問的效能。

b+tree是在b-tree的基礎上做了2點優化:

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

a:存放索引值。

b:存放資料的位址。

c:乙個節點。

a+b:一條資料。

這樣做的原因:mysql預設的乙個節點(也就是c)16k的大小,可以通過show global status like "innodb_page_size" 看到該值是16384,每次io讀取16k大小的資料,以索引列(也就是a)是bigint型別為例,大小8位元組,每一條資料還有乙個指向下一層的指標(也就是b)6位元組,16384/(8+6)=1170,乙個節點就大約可以存1170條資料。此時乙個節點(c)就最多儲存不到1170條資料了。

如果葉一條資料如上圖d的大小設為1kb的話,乙個節點為16k,則乙個葉子節點可以儲存16個小結點此時高度為3的b+tree存滿資料的話,可以儲存的資料條數:1170*1170*16 ,大概為2千萬條資料。

(2)葉子節點採用指標連線,提高區間訪問的效能。

如上圖,如果要在上圖中查詢索引為18,select * from t where col2 = 18,此時如果使用者想要查詢select * from t where col2 > 18的所有資料,只需要不斷地往後移動指標就可以查詢到大於18的所有索引,因為資料檔案中維護的索引從左到右都是遞增的。

5、hash索引

如果資料庫索引是hash的話,每次插入資料的時候,先經過hash函式計算得到乙個結果值,再將這個值和資料檔案的位址一起都儲存到hash對映表中。取資料時,也一樣,並且hash運算速度非常快,比如要查詢select * from t where col2 = 89;此時效率比b+tree還高。但是如果範圍查詢時select * from t where col2 > 89;hash速度是非常慢的。

MySQL學習 2 MySQL索引

6 索引設計原則 mysql官方對索引的定義為 索引 index 是幫助mysql高效獲取資料的資料結構 有序 在資料之外,資料庫系統還維護者滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用 指向 資料,這樣就可以在這些資料結構上實現高階查詢演算法,這種資料結構就是索引 一般來說索引本身也很...

2 mysql(索引 儲存引擎)

課程大綱 1 在功能上的分類 聚簇索引 建表時,指定了主鍵列,mysql innodb 會將主鍵作為聚簇索引列 如果沒有主鍵,會選擇唯一鍵作為聚集索引。輔助索引 1 單列輔助索引 2 聯合索引 多個列作為索引條件,生成索引樹,理論上設計的好的,可以減少大量的回表查詢 注 聯合索引注意最左原則,inx...

MySQL解析(2) MySQL版本

mysql ab目前維護的mysql版本主要包括 mysql 4.1 mysql 5.0 mysql 5.1 mysql 6.0 其中處於stable狀態的有mysql4.1 5.0,而mysql5.1處於rc beta 版,mysql 6.0 處於 alpha版。mysql 5.0是stable的...