mysql中的prof是什麼意思 MySQL索引

2021-10-17 23:40:16 字數 3550 閱讀 2032

索引的種類

普通索引

最基本的索引,沒有任何限制。

唯一索引

索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。

主鍵索引

是一種特殊的唯一索引,乙個表只能有乙個主鍵,不允許有空值。建立主鍵時就自動生成了該索引。

組合索引

指多個欄位上建立的索引,只有在查詢條件中使用了建立索引時的第乙個字段,索引才會被使用。遵循最左匹配原則。

全文索引

主要用來查詢文字中的關鍵字,而不是直接與索引中的值相比較

索引的型別

fulltext

即為全文索引,目前只有myisam引擎支援。目前只有 char、varchar ,text 列上可以建立全文索引。

hash

由於hash的唯一(幾乎100%的唯一)及類似鍵值對的形式,很適合作為索引。hash索引可以一次定位,不需要像樹形索引那樣逐層查詢,因此具有極高的效率。

btree

要講b+樹,就要先講講b樹的規則:

而b+樹是b樹變體,其定義基本與b樹相同,除了:

非葉子節點的子樹指標與關鍵字個數相同

非葉子節點的的子樹指標p[i],指向關鍵字值(k[i],k[i+1])的子樹

非葉子節點只用來索引,資料都儲存在葉子節點中

所有葉子節點均有乙個鏈指標指向下乙個葉子節點

b+樹如圖所示:

rtree在mysql很少使用,僅支援geometry資料型別,支援該型別的儲存引擎只有myisam、bdb、innodb、ndb、archive幾種。

使用hash索引的缺點

(1)hash 索引僅僅能滿足"=","in"和"<=>"查詢,不能使用範圍查詢。

由於 hash 索引比較的是進行 hash 運算之後的 hash 值,所以它只能用於等值的過濾,不能用於基於範圍的過濾,因為經過相應的 hash 演算法處理之後的 hash 值的大小關係,並不能保證和hash運算前完全一樣。

(2)hash 索引無法被用來避免資料的排序操作。

由於 hash 索引中存放的是經過 hash 計算之後的 hash 值,而且hash值的大小關係並不一定和 hash 運算前的鍵值完全一樣,所以資料庫無法利用索引的資料來避免任何排序運算;

(3)hash 索引不能利用部分索引鍵查詢。

對於組合索引,hash 索引在計算 hash 值的時候是組合索引鍵合併後再一起計算 hash 值,而不是單獨計算 hash 值,所以通過組合索引的前面乙個或幾個索引鍵進行查詢的時候,hash 索引也無法被利用。

(4)hash 索引在任何時候都不能避免表掃瞄。

前面已經知道,hash 索引是將索引鍵通過 hash 運算之後,將 hash運算結果的 hash 值和所對應的行指標資訊存放於乙個 hash 表中,由於不同索引鍵存在相同 hash 值,所以即使取滿足某個 hash 鍵值的資料的記錄條數,也無法從 hash 索引中直接完成查詢,還是要通過訪問表中的實際資料進行相應的比較,並得到相應的結果。

(5)hash 索引遇到大量hash值相等的情況後效能並不一定就會比b-tree索引高。

對於選擇性比較低的索引鍵,如果建立 hash 索引,那麼將會存在大量記錄指標資訊存於同乙個 hash 值相關聯。這樣要定位某一條記錄時就會非常麻煩,會浪費多次表資料的訪問,而造成整體效能低下。

使用b+樹索引的優點

(1)b+樹的磁碟讀寫代價更低

b+樹的非葉子節點只儲存了關鍵字的資料,沒有儲存具體的資訊,這樣記憶體中一次性讀取的關鍵字就更多,相對來說io讀寫速度也就降低了

(2)b+樹的查詢效率更加穩定

由於內部節點並不是最終指向內容的節點,而只是葉子節點中關鍵字的索引,所以任何關鍵字必須從根節點到葉子節點,是穩定的

(3)b+樹更有利於對資料庫的掃瞄

b樹提高了io效能,但沒有解決效率低下的問題,b+樹只需要遍歷葉子節點就能進行資料庫常見的範圍查詢

聯合索引的最左匹配原則

1、最左字首匹配原則,非常重要的原則,mysql會一直向右匹配直到遇到範圍查詢(>、 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整。

2、=和in可以亂序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優化器會幫你優化成索引可以識別的形式

我對最左匹配原則的理解為每個索引點都儲存了聯合索引項,以建立了(a,b,c)索引為例,會從左到右建立b+樹,也就是說先從a進行查詢,如果a是等值查詢,找到a會繼續從b進行查詢,b如果也是等值查詢,找到b後會繼續從c進行查詢,這樣a,b,c都走到了索引。但是如果從a開始查詢的時候,若a是範圍查詢,還是能依據索引進行查詢,但根據最左匹配原則的第一條,會停止後面的匹配,也就是說查詢去a的範圍後,後面b的值和c的值都只能去a的範圍中進行查詢,走不了索引了。

下面就能很好理解為什麼下面兩個查詢語句都能走索引了。

select * from test where a=10 and b =10 and c<10;

select * from test where a<10 and b <10 and c<10;

聚集索引和非聚集索引

myisam的索引是非聚集索引,具體表現在結構與資料的分離。myisam的b+樹的葉子結點的data域中儲存的是位址,與該位址相對映的是另乙個檔案中所儲存的資料。因此需要從主鍵值獲取到資料位址,再從位址獲取具體資料。myisam的輔助索引與主鍵索引區別不大,只是主鍵索引的key不能重複。

innodb的索引是聚集索引,因為innodb的b+樹的葉子結點的data域儲存的就是資料,省去了根據位址查詢資料的步驟。innodb的輔助索引的data域就是主鍵的數值,所以進行輔助索引前,會先獲取主鍵的資訊,所以主鍵不宜過大,因為會到致輔助索引過大,很消耗資源。innodb的主鍵是主鍵索引,非主鍵是輔助索引。

索引是建立越多越好嗎?

資料量小的表不需要建立索引,建立索引會增加額外的索引開銷

資料變更需要維護索引,因此需要更多的索引意味著更多的維護成本

更多的索引意味著也需要更多的空間

索引的注意要點

1.列上進行函式計算將不會使用索引;

2.對於建立索引的列,避免儲存null,null會使索引更加複雜、效率變低,可以使用not null進行約束;

3.對於模糊查詢like '%abc%',將不會使用索引,而like 'abc%'將會使用索引;

4.對於not in、not exists、!=等負向查詢將不會使用索引;

5.每次查詢只使用乙個索引,如果where條件使用了索引,order by將不再使用索引;

6.對於where子句中有多個查詢條件的,單列索引的效率不如復合索引,因為查詢每次只能使用乙個索引;

7.mysql只對以下操作符才使用索引:、>=、between、in,但是需要注意in的範圍值不要太多;

8.union all可以使用索引,但本身效率不是很高,不建議使用;

9.列上進行型別轉換的將不會使用索引;

10.老版本mysql對or條件不使用索引,新版本才支援,不建議使用or。

參考:

android中的 inflate是什麼意思

inflate 的作用就是將乙個用xml定義的布局檔案查詢出來,注意與findviewbyid 的區別,inflate是載入乙個布局檔案,而findviewbyid則是從布局檔案中查詢乙個控制項。1.獲取layoutinflater物件有三種方法 layoutinflater inflater la...

matplotlib inline 是什麼意思

使用 matplotlib命令可以將matplotlib的圖表直接嵌入到notebook之中,或者使用指定的介面庫顯示圖表,它有乙個引數指定matplotlib圖表的顯示方式。inline表示將圖表嵌入到notebook中。python提供了許多魔法命令,使得在ipython環境中的操作更加得心應手...

matplotlib inline 是什麼意思

使用 matplotlib命令可以將matplotlib的圖表直接嵌入到notebook之中,或者使用指定的介面庫顯示圖表,它有乙個引數指定matplotlib圖表的顯示方式。inline表示將圖表嵌入到notebook中。python提供了許多魔法命令,使得在ipython環境中的操作更加得心應手...