mysql索引略知一二

2021-07-17 02:58:16 字數 1525 閱讀 7720

最近偶有雅興和時間,打算剖析一下mysql的索引機制,由於偶的根基薄弱,能力尚欠,在剖析中可能存在片面和錯誤,還請指出和諒解,謝謝

注:如果沒有特殊說明,一下的索引都是主索引

在mysql中索引是大家關注最多的乙個知識點,無論是面試和工作,我們都知道mysql最長用的引擎主要為:innodb和myisam,索引和資料庫引擎是密切相關的。不同的引擎,使用的索引也不一樣。innodb使用的是聚集索引,myisam使用的是非聚集索引,下面就這兩種索引做一下介紹:

索引:聚集索引,資料和索引的資料結構物理上是在一起,比如,如果索引結構是乙個樹,那麼這棵樹不僅包含鍵,也包含資料值,包含完整的資料。

非聚集索引,資料和索引的資料結構物理上不在一起,比如,如果索引結構是乙個樹,那麼這棵樹包含鍵,以及資料所在的位址

索引結構:

innodb使用b+樹作為索引結構,葉子上儲存了索引的資料。myisam使用的也是b+樹的索引結構,不同的是,其葉子上儲存了索引資料所在的實體地址。

其中innodb的輔索引,葉子上儲存的是主索引的鍵資料。在用輔索引查詢資料時,要遍歷兩次索引結構,一次為輔助索引的資料結構,另一次為主索引的資料結構。

我們都知道,無論是b+樹還是b-樹都是b樹的變種,為什麼不直接使用b樹(平衡二叉樹)呢?

主要取決於他們不同結構,b+或者b-樹都是多路平衡二叉樹,索引樹的高度為h=log(d)n而b樹是一棵平衡二叉樹,其高度為h=log(2)n,所以b+或者b-樹的樹高小於b樹,查詢時間也就小於b樹,比b樹更快。並且邏輯上很近的資料,在b樹或者紅黑樹上物理上相差比b+或者b-樹遠,所以不能很好的利用磁碟或者計算機io區域性性特性,但是b+樹或者b-樹可以利用此區域性性原理,預讀幾頁資料,達到減少io磁碟的次數,提高效能。

為什麼mysql索引使用b+樹,而沒有選擇使用b-樹呢?

因為b+樹更適用於外存索引,這是由兩者的結構決定的,b-樹是在每個節點既儲存鍵又儲存資料,還儲存下乙個節點的位址。b+樹只儲存鍵和下乙個節點的位址,不存資料,這樣的話節點所佔的空間就會小於b-樹節點所佔的空間,一般我們設計節點的時候,會把乙個節點設計為乙個固定大小的頁,這樣乙個頁所包含的鍵和位址的數量會大於b-樹的結構。所以b+樹的度會遠遠大於b-樹的讀,所以搜尋速度比b-樹要快很多。

聯合索引是什麼?

聯合索引其實是乙個有序元組,如同字典一樣,舉個例子,假如你有乙個按姓氏和名字排序的**簿,首先按姓氏排序,然後相同姓氏的按名字排序,如果你知道姓氏,對查詢**號碼非常有用,如果你再知道名字,對查**號碼更有用。如果你只知道名字,對查**號碼幾乎沒有什麼用

mysql索引優化:

1、不要使用過長的鍵作為主索引的鍵,因為每個輔助索引都會包含主索引的鍵,如果過長,那麼每個輔助索引結構就會變得很大,佔空間

2、主索引的鍵盡量單調,如果不單調,每次在建立索引的時候,每次插入會引起b+樹的調整,效能下降

3、建立索引時,要考慮最左字首原理

4、建立索引時,要考慮資料量,一般資料量小於2000時,沒必要建立索引

5、建立索引時,要考慮索引的選擇性,保證字段或者欄位的字首不重複值所佔比例在90%以上

6、建立表時,最好指定乙個業務無關的自增欄位,有利於索引的建立

canvas略知一二

一 修改了canvas的寬高之後,畫布內容會清空。效果同呼叫context.clearrect 0,0,width,height 二 canvas畫布上drawimage othercanvasele,0,0,width,height 後,之後在othercanvasele畫布上新增或修改的內容,並...

MySQL使用指南(一)(二)

mysql使用指南 一 http www.51cto.com 2005 10 24 14 40 網路使用者 有很多朋友雖然安裝好了mysql但卻不知如何使用它。在這篇文章中我們就從連線mysql 修改密碼 增加使用者等方面來學習一些mysql的常用命令。一 連線mysql。1 例1 連線到本機上的m...

mysql 索引 手冊 MySQL 索引

mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...