mysql索引分成以下幾類:
b+索引
hash索引
全文索引
b+樹索引分為聚集索引和非聚集索引(輔助索引)。聚集索引是通過表的主鍵來構建b+樹,聚集索引不僅包括索引的值還包括其他列的相關資訊。聚集索引中的記錄是根據鍵值順序存放的。聚集索引的非葉子節點儲存的是《健值,索引》對。位址為指向下一層的指標,見下圖b+資料結構。
在聚集索引中會儲存key及指向下一節點的指標。
非聚集索引的葉子節點並不儲存列的其他資訊,其中葉子節點儲存的是《鍵值,(記錄)位址》,記錄位址存在以下的形式。
記錄的主鍵值
第一種是myisam儲存b+樹的儲存方式,在myisam儲存引擎中沒有聚集索引。索引的記錄並不放在b+樹中,而是放在堆表。在myisam儲存引擎中非聚集索引方式的主鍵索引和其他索引的區別在與該索引是否唯一的並且非空。
innodb儲存引擎採用的b+數的聚集索引,他可以通過主鍵id快速查詢記錄。聚集索引中所有記錄都放在葉子節點。
不通儲存引擎下的非聚集索引比較如下:
操作myisam
innodb
讀所有的索引是非聚集索引,因此所有查詢操作的開銷均差不多
通過輔助索引只能查詢到主鍵值,要查詢完整記錄還需要通過一次聚集索引 (這種查詢方式也叫書籤查詢)
寫所發生更新,則更新索引
僅主鍵值發生改變時,需要更新輔助索引
mysql的儲存結構有tablespace、segement、extent,page。
mysql建立索引的時候會建立乙個新的b+tree。
他會先為非葉子節點segement分配乙個innode entry【用來管理資料檔案中的segemnet】,再建立root page。將segement的位置記錄到root page中,如何分配leaf segment的inode entry。然後隨之記錄到root page。
前提:假設每一行資料大小為1k
計算葉子節點可以儲存大小
上面有提到過mysql中存在page儲存結構,乙個page大小為16k。那麼1個page最多可以儲存16條記錄。及在聚集索引下每個葉子節點最多可以儲存16條記錄。
計算非葉子節點個數
那麼非葉子節點可以儲存多少資料,假設主鍵id為bigint型別,長度為8位元組。在innode中指標需要占用6個位元組,這樣乙個關鍵字所佔位元組為(8+6)14位元組。那麼接下去就是乙個page中能存放多少這樣的單元,其實就代表有多少指標,即16kb/14b=1170。那麼可以算出一棵高度為2的b+樹,大概能存放1170*16=18720條這樣的資料記錄。
3階b+數儲存數量
根據同樣的原理我們可以算出乙個高度為3的b+樹大概可以存放:1170117016=21902400行資料。所以在innodb中b+樹高度一般為1-3層,它就能滿足千萬級的資料儲存。在查詢資料時一次頁的查詢代表一次io,所以通過主鍵索引查詢通常只需要1-3次邏輯io操作即可查詢到資料。
索引失效其實取決於b+樹的一些特性
最左字首原則
在b+樹中的鍵值是按照組合索引的順序排列的如(a,b,c)當你查詢a=?and c=?的時候那麼這個事實上只有a才會在b+樹中查詢到對應的關鍵值。而c無法使用b+樹進行索引。
like 以%開頭
以%開通鍵值無法確定肯定無法在b+樹中索引
or語句前後沒有同時使用索引
or 或查詢,當中任意乙個不建立索引,那麼該字段無對應的索引就需要進行全表掃瞄
在索引列上使用 is null 或 is not null操作
b+樹上任意乙個關鍵字都不會為空所以該索引會失敗
在索引欄位上使用not,<>,!=。
b+上的查詢是和關鍵字比較大小,查詢到合適的範圍,所以任意一種不等於符號都會導致索引失敗
對索引字段進行計算/使用函式
計算之後會導致根本找不到對應的關鍵字
hash索引使用場景不如b+樹那麼多,經過hash索引之後也一定會進行一次聚集索引。
hash索引是基於hash表的精準查詢。對於每一行資料,儲存引擎都會對所有的索引列計算乙個hash code,並將的有的hash code儲存在索引中,同時在雜湊表中儲存指向每個資料行的指標。
hash index中不支援範圍查詢,只支援等值查詢。而且也不能進行部分索引匹配,因為索引的所有內容都要進行hash
mysql 整理索引 Mysql索引整理
1 mysql基本單位是頁,大小為16kb 16384 1024 頁是為了增加查詢效率,減少io的互動 區域性性原理 2 頁與頁之間是雙向鍊錶,插入的時候會根據主鍵id進行排序 單葉資料結構.jpg 3 在頁上有乙個頁目錄,相當於把資料進行分組,存放的是當前組最小的主鍵id,指標並且指向對應的資料 ...
mysql 索引 磁碟整理 mysql 索引整理
1 只對 where 和 order by 子句中需要的列新增索引,多餘的索引智慧型導致不必要的硬碟空間愛你消耗。每次修改表資訊時會更新索引,因此有索引的表效能會相應降低。2 對於要使用索引的列要使用屬性 not null 這樣就永遠不會儲存 null 值。3 最好用唯一化索引,一般情況下,當查詢優...
mysql 整理 索引
一 在 command line client 中進行複製 在命令視窗ctrl c是不起作用的,只能靠右擊彈出的選單中的功能。可以這樣做 右擊 選擇 標記 然後用滑鼠拖動要複製的內容,然後在合適的位置右擊 選擇 複製 索引 一 索引的原理 對要查詢的字段建立索引其實就是把該字段按照一定的方式排序 建...