mysql索引要素 mysql索引和索引的原理

2021-10-18 11:52:42 字數 1403 閱讀 1780

首先為什麼要加索引?

資料庫伺服器有兩種儲存介質,我們需要把索引放到硬碟上,在硬碟上進行查詢時會產生i/o 操作 ,我們通過索引來查詢某⾏資料的時候,需要計算產⽣的磁碟 i/o 次數,當磁碟 i/o 次數越多,所消耗的時間也就越⼤。如果我們能讓索引的資料結構儘量減少硬碟的 i/o操作,所消耗的時間也就越⼩。

什麼情況下建立索引?

在資料表中的資料⾏數⽐較少的情況下,⽐如不到 1000 ⾏,是不需要建立索引的。另外,當資料重複度⼤,⽐如⾼於 10% 的時候,也不需要對這個欄位使⽤索引。

索引的種類有哪些?

從功能邏輯上說,索引主要有 4 種,分別是普通索引、唯⼀索引、主鍵索引和全⽂索引。普通索引是基礎的索引,沒有任何約束,主要⽤於提⾼查詢效率。唯⼀索引就是在普通索引的基礎上增加了資料唯⼀性的約束,在⼀張資料表⾥可以有多個唯⼀索引。主鍵索引在唯⼀索引的基礎上增加了不為空的約束,也就是 not nullunique,⼀張表⾥最多只有⼀個主鍵索引。全⽂索引⽤的不多,mysql ⾃帶的全⽂索引只⽀持英⽂。我們通常可以採⽤專⻔的全⽂搜尋引擎,⽐如 eselasticsearch) 和 solr。其實前三種索引(普通索引、唯⼀索引和主鍵索引)都是⼀類索引,只不過對資料的約束性逐漸提公升。在⼀張資料表中只能有⼀個主鍵索引,這是由主鍵索引的物理實現⽅式決定的,因為資料儲存在⽂件中只能按照⼀種順序進⾏儲存。但可以有多個普通索引或者多個唯⼀索引。

按照物理實現⽅式,索引可以分為 2 種:聚集索引和⾮聚集索引。 聚集索引可以按照主鍵來排序儲存資料,這樣在查詢⾏的時候⾮常有效。舉個例⼦,如果是⼀本漢語字典,我們想要查詢「數」這個字,直接在書中找漢語拼⾳的位置即可,也就是拼⾳「shu」。這樣找到了索引的位置,在它後⾯就是我們想要找的資料⾏。 在資料庫系統會有單獨的儲存空間存放⾮聚集索引,這些索引項是按照順序儲存的,但索引項指向的內容是隨機儲存的。也就是說系統會進⾏兩次查詢,第⼀次先找到索引,第⼆次找到索引對應的位置取出資料⾏。⾮聚集索引不會把索引指向的內容像聚集索引⼀樣直接放到索引的後⾯,⽽是維護單獨的索引表(只維護索引,不維護索引指向的資料),為資料檢索提供⽅便。我們還以漢語字典為例,如果想要查詢「數」字,那麼按照部⾸查詢的⽅式,先找到「數」字的偏旁部⾸,然後這個⽬錄會告訴我們「數」字存放到第多少⻚,我們再去指定的⻚碼找這個字。

聯合索引的最左原則就是建立索引key union_index (a,b,c)時,等於建立了(a)、(a,b)、(a,b,c)三個索引,從形式上看就是索引向左側聚集,所以叫做最左原則,因此最常用的條件應該放到聯合索引的組左側。

利用聯合索引加速查詢時,聯合查詢條件符合「交換律」,也就是where a = 1 and b = 1 等價於 where b = 1 and a = 1,這兩種寫法都能利用索引key union_index (a,b,c)。

在 mysql 中採⽤的是 b+ 樹,b+樹在查詢效能上更穩定,在磁碟⻚⼤⼩相同的情況下,樹的構造更加矮胖,所需要進⾏的磁碟 i/o 次數更少,更適合進⾏關鍵字的範圍查詢。

mysql索引要素 mysql 索引的原理

1 考慮下面的情況,mysql desc student field type null key default extra school varchar 64 yes null name varchar 64 yes null birthday date yes null 3 rows in se...

mysql 雜湊索引 MySQL索引之雜湊索引

雜湊索引 hash index 建立在雜湊表的基礎上,它只對使用了索引中的每一列的精確查詢有用。對於每一行,儲存引擎計算出了被索引的雜湊碼 hash code 它是乙個較小的值,並且有可能和其他行的雜湊碼不同。它把雜湊碼儲存在索引中,並且儲存了乙個指向雜湊表中的每一行的指標。在mysql中,只有me...

mysql主鍵索引 MySQL索引之主鍵索引

在mysql裡,主鍵索引和輔助索引分別是什麼意思,有什麼區別?上次的分享我們介紹了聚集索引和非聚集索引的區別,本次我們繼續介紹主鍵索引和輔助索引的區別。1 主鍵索引 主鍵索引,簡稱主鍵,原文是primary key,由乙個或多個列組成,用於唯一性標識資料表中的某一條記錄。乙個表可以沒有主鍵,但最多只...