資料庫高階(二)索引與SQL優化 B 樹

2021-10-22 16:11:49 字數 2505 閱讀 1541

mysql高階(二)

?索引與sql優化

✨什麼是索引?

索引(index)類似圖書的目錄索引,可以提高資料檢索的效率,降低資料庫的io成本。

mysql官方對索引的定義為:

索引(index)是幫助mysql高效獲取資料的資料結構

是快速查詢排好序的一種資料結構

✨索引的分類:

1)主鍵索引:primary key

即主索引,根據主鍵 建立索引,不允許重複,不允許空值,通常自增;

注意刪除時要先取消自增,再刪除主鍵

如果表中沒有定義主鍵,innodb 會選擇⼀個唯⼀的非空索引代替。 如果沒有這樣的索引,innodb 會隱式定義⼀個主鍵來作為聚簇索引

2)唯一索引:unique key

用來建立索引的列的值必須是唯一的,允許空值。

3)普通索引:

用表中的普通列構建的索引,沒有任何限制

4)全文索引:用大文字物件的列構建的索引

mysql8的版本中⽀支援了了對中⽂文分詞的全⽂文索引

5)組合索引

用多個列組合構建的索引,這多個列中的值不允許有空值

注意:組合索引的「最左」原則

1.b+樹只有葉子節點儲存資料

2.非葉子節點起到了索引的作用

3.所有葉子節點使用鍊錶相連

?索引的實現原理——b+樹的好處:

1.磁碟讀寫代價更低

b樹的資料和索引都在同乙個節點上,那麼每個塊中包含的索引是少量的,如果想要取出比較深層的資料,意味著要讀取更多的塊,才能得到想要的索引和資料,那麼就增加了io次數

而b+樹中每個塊能儲存的索引是b樹的很多倍,那麼獲取比較深層的資料,也只需要讀取少量的塊就可以,那麼就減少了磁碟的io次數

2.隨機io的次數更少 b+樹的優勢是什麼?

而隨機i/o是指讀寫操作事件連續,但訪問位址不連續,時長約為10ms

在相同情況下,b樹要進行更多的隨機io,而b+樹需要更多的順序io,因此b+樹效率也更快

3.查詢速度更穩定

由於b+tree 非葉子節點不儲存資料(data),因此所有的資料都要查詢至葉子節點,而葉子節點的高度都是相同的,因此所有資料的查詢速度都是一樣的。

?聚簇索引和非聚簇索引

聚簇索引:索引即資料,資料即索引

非聚簇索引:找到索引僅僅是找到當前索引值和key 如果需要索引外的內容,則需要回表

⚠️注意:關於索引原理和聚簇非聚簇索引都是以innodb表引擎為基礎

?myisam 和 innodb的區別

✨資料儲存方式:

innodb由兩種檔案組成,表結構,資料和索引

myisam由三種檔案組成,表結構、資料、索引

✨索引的方式:

索引的底層都是基於b+tree的資料結構建立

innodb中主鍵索引為聚簇索引,輔助索引是非聚簇索引

myisam中資料和索引存在不同的檔案中,因此都是非聚簇索引

✨事務的支援:

innodb支援事務

myisam不支援事務

?總結:

資料庫的索引是為了提高資料檢索速度

資料庫的索引是基於b+tree的資料結構實現的

在innodb中主鍵是聚簇索引而輔助索引是非聚簇索引

在myisam中主鍵索引和輔助索引都是非聚簇索引

?慢查詢優化

✨使用explain 分析一條查詢語句,關注以下資訊:

type 針對單錶的訪問⽅方法

possible_keys 可能⽤用到的索引

key 實際上使⽤用的索引

rows 預估的需要讀取的記錄條數

✨檢索速度慢通常是由於:

type: all 全表檢索

最好的檢索型別:

type: const 直接找到檢索

✨無法使用檢索的幾種情況:

1.在列上使用函式和進行運算

2.出現了查詢條件左右兩側型別不匹配時發生隱士轉換,導致索引失效

✨復合索引使用的注意事項:

1.多個單列表索引並不是最佳選擇

2.復合索引的最左字首原則

查詢條件中使用了復合索引的第乙個字段,索引才會被使用。因此,在復合索引中索引列的順序至關重要。如果不是按照索引的最左列開始查詢,則無法使用索引。

3.盡可能達成索引覆蓋

如果乙個索引包含所需要的查詢的字段的值,直接根據索引的查詢結果返回資料,而無需讀表,能夠極大的提高效能。因此,可以定義乙個讓索引包含的額外的列,即使這個列對於索引而言是無用的。

資料庫SQL,索引優化

一 mysql 索引分為兩種結構 1 hash索引 a 缺點 i.只支援等值比較 ii.無序,不支援範圍查詢 iii.組合索引時,無法單獨使用 iv.通過 hash 命中後,資料庫需要再次對比 v.hash 衝突量過大的情況下,效能較差 2 btree索引 a 是否要支援事務,如果要請選擇innod...

資料庫索引 sql優化 引擎

1.索引分類 唯一 非唯 一 聚集 非聚集 主鍵索引 是特殊的唯一索引 聯合索引。2.聚集 非聚集的區別 定義 聚集索引,表記錄的物理順序與鍵的索引排列順序一致 我的理解是 索引和記錄按順序排 非聚集索引,表記錄的物理順序與鍵的索引排列順序不一致 我的理解是 索引和記錄不按順序排 優缺點 聚集索引,...

資料庫SQL優化(二)

資料庫sql優化 二 16.索引並不是越多越好,索引固然可以提高相應的 select 的效率,但同時也降低了 insert 及 update 的效率,因為 insert 或 update 時有可能會重建索引,所以怎樣建索引需要慎重考慮,視具體情況而定。乙個表的索引數最好不要超過6個,若太多則應考慮一...