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個,若太多則應考慮一...