資料庫優化之索引

2021-10-10 05:57:04 字數 4027 閱讀 7226

索引是對資料庫表中一列或多列的值進行排序的一種結構資料,使用索引可快速訪問資料庫表中的特定資訊。

資料庫索引是建立在表的某列上的,並且儲存了這一列的所有值。同時儲存了指向表中的相應行的指標。

聚簇索引(聚集索引)

按照資料存放的物理位置為順序,聚簇索引能提高多行檢索的速度,乙個表只能包含乙個聚集索引。

非聚簇索引(非聚集索引)

非聚簇索引對於單行的檢索很快。

唯一索引

唯一索引是不允許其中任何兩行具有相同索引值的索引。例如,如果在employee表中職員的姓(lname)上建立了唯一索引,則任何兩個員工都不能同姓。

主鍵索引

在資料庫關係圖中為表定義主鍵將自動建立主鍵索引,主鍵索引是唯一索引的特定型別。該索引要求主鍵中的每個值都唯一。

復合引列

可以基於資料庫表中的單列或多列建立索引。

優點:

1、通過建立唯一性索引,可以保證資料庫表中每一行資料的唯一性。

2、大大加快資料的檢索速度。

3、可以加速表和表之間的連線。

4、在使用分組和排序子句進行資料檢索時,可以顯著減少查詢中分組和排序的時間。

5、通過使用索引,可以在查詢的過程中,使用優化隱藏器,提高系統的效能。

缺點:

1、建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。

2、索引需要佔物理空間,除了資料表佔資料空間之外,每乙個索引還要佔一定的物理空間,如果要建立聚簇索引,那麼需要的空間就會更大。

3、當對表中的資料進行增加、刪除和修改的時候,索引也要動態的維護,降低了資料的維護速度。

1、很少使用或者參考的列不應該建立索引。

2、值分布很稀少的列不適合建索引。比如性別。

3、頻繁更新的字段不適合建立索引。

4、定義為text, image和bit資料型別的列不應該增加索引。

5、當修改效能遠遠大於檢索效能時,不應該建立索引。

直接建立索引:

用create index語句或者使用建立索引嚮導。

可以定製建立出符合自己需要的索引。

既可以建立聚簇索引,也可以建立非聚簇索引,既可以在乙個列上建立索引,也可以在兩個或者兩個以上的列上建立索引。

間接建立索引:

通過定義主鍵約束或者唯一性鍵約束,間接建立索引。

在建立主鍵約束時,系統自動建立乙個唯一性的聚簇索引。

在建立唯一性約束時,系統自動建立乙個唯一性的非聚簇索引。

建立單列索引:

create index index_name

on employee (employee_name)

建立復合索引:

create index index_name_age

on employee (employee_name, employee_age)

1、多條件查詢時使用or索引會生效。要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引。

2、對於多列索引(聯合索引),沒有使用最左邊的索引,索引失效。

3、以『%』開頭的like查詢會導致索引失效。以『%』結尾,索引可以使用。

4、如果列型別是字串,要在條件中將資料使用引號引用起來,否則索引失效。

5、where 子句裡對索引列上有數**算,索引失效。

6、where 子句裡對有索引列使用函式,索引失效。

7、如果mysql估計使用全表掃瞄要比使用索引快,則不使用索引,比如資料量極少的表。

8、where子句的查詢條件裡有不等號,索引失效。

擴充套件:檢視索引的使用情況, 執行sql語句:

show status like 『handler_read%'
handler_read_key:這個值越高越好,越高表示使用索引查詢到的次數。

handler_read_rnd_next:這個值越高,說明查詢低效。

首先,資料庫索引使用樹來儲存,因為樹的查詢效率高,而且二叉查詢樹還可以保持資料的有序。

為了減少記憶體的占用,資料庫索引是儲存在外部磁碟上。mysql衡量查詢效率的標準就是磁碟io次數。

如果利用二叉樹作為索引結構,那麼磁碟的io次數和索引樹的高度是相關的。為了提高查詢效率,就需要減少磁碟io數。為了減少磁碟io的次數,就需要盡量降低樹的高度,需要把原來「瘦高」的樹結構變的「矮胖」,樹的每層的分叉越多越好,b樹正好符合我們的要求,這也是b樹的特徵之一。

b樹(b類樹)的特點就是每層節點數目非常多,層數很少,目的就是為了就少磁碟io次數。

b樹是一種多路平衡查詢樹,它的每乙個節點最多包含k個孩子,k稱為b樹的階。k的大小取決於磁碟頁的大小。

乙個m階的b樹具有如下幾個特徵:

1、根結點至少有兩個子女。

2、每個中間節點都包含k-1個元素和k個孩子,其中 m/2 <= k <= m。

3、每乙個葉子節點都包含k-1個元素,其中 m/2 <= k <= m。

4、所有的葉子結點都位於同一層。

5、每個節點中的元素從小到大排列,節點當中k-1個元素正好是k個孩子包含的元素的值域分劃。

b樹結構

乙個m階的b+樹具有如下幾個特徵:

1、有k個子樹的中間節點包含有k個元素(b樹中是k-1個元素),每個元素不儲存資料,只用來索引,所有資料都儲存在葉子節點。

2、所有的葉子結點中包含了全部元素的資訊,及指向含這些元素記錄的指標,且葉子結點本身依關鍵字的大小自小而大順序鏈結。

3、所有的中間節點元素都同時存在於子節點,在子節點元素中是最大(或最小)元素。

b+樹結構

b+樹和b樹的區別:

1、單一節點儲存更多的元素,使得查詢的io次數更少。

2、所有查詢都要查詢到葉子節點,查詢效能穩定。

3、所有葉子節點形成有序鍊錶,便於範圍查詢。

4、b+樹中間節點沒有儲存資料,只有葉節點存放資料,而b樹每個索引節點都會有data域。

紅黑樹的特點:

1、節點是紅色或黑色。

2、根節點是黑色。

3、每個葉子節點都是黑色的空節點(nil節點)。

4、每個紅色節點的兩個子節點都是黑色。(從每個葉子到根的所有路徑上不能有兩個連續的紅色節點)

5、從任一節點到其每個葉子的所有路徑都包含相同數目的黑色節點。

6、從根到葉子的最長路徑不會超過最短路徑的2倍。

紅黑樹結構:

什麼情況下使用紅黑樹?紅黑樹和b樹使用場合有什麼不同?

1、兩者都是有序的資料結構,可用作資料容器。

2、紅黑樹多用在內部排序,即全放在記憶體中的,微軟stl的map和set的內部實現就是紅黑樹。

3、b樹多用在記憶體裡放不下,大部分資料儲存在外存上時。因為b樹層數少,因此可以確保每次操作,讀取磁碟的次數盡可能的少。 在資料較小,可以完全放到記憶體中時,紅黑樹的時間複雜度比b樹低。反之,資料量較大,外存中佔主要部分時,b樹因其讀磁碟次數少,而具有更快的速度。

注意:1、b-樹和b樹是同一概念,翻譯不同所致。

2、度數:在樹中,每個節點的子節點(子樹)的個數就稱為該節點的度(degree)。

3、階數:(order)階定義為乙個節點的子節點數目的最大值。(自帶最大值屬性)

mysql資料庫優化之索引優化

一 如何選擇合適的列建立索引 1 一般會選擇在where從句中,group by從句中,order by從句中 join on 從句中,建立索引,在特殊情況下select 從句中,所出的列,進行索引,當乙個索引包含了查詢中的所有列,那麼稱之為這樣的索引為覆蓋索引,當我們的查詢執行的頻率非常高,並且索...

資料庫索引 索引優化

二 三星索引 三 合適設計理想索引 謂詞簡單謂詞和複雜謂詞 where字句中的每個條件稱為乙個謂詞。過濾因子 描述了謂詞的選擇性,即表中滿足謂詞條件的記錄行數所佔的比例 過濾因子 ff 結果集的數量 錶行的數量 平均過濾因子 1 不同列值的數量 索引片及匹配列 乙個索引定義乙個索引片,如果where...

MySQL 資料庫效能優化之索引優化

資料庫效能優化專題 系列的第三篇文章 mysql 資料庫效能優化之索引優化 大家都知道索引對於資料訪問的效能有非常關鍵的作用,都知道索引可以提高資料訪問效率。為什麼索引能提高資料訪問效能?他會不會有 是不是索引建立越多,效能就越好?到底該如何設計索引,才能最大限度的發揮其效能?這篇文章主要是帶著上面...