mysql的存儲引擎以及索引

mysql的主要索引innodb和misam

innodb:
根據存儲引擎的不同索引的實現也不同,基於B+樹數據結構實現的索引比較多,也有hash索引,根據不同的場景應用不同。

接下來描述下innodb存儲引擎,innodb的主鍵索引是在b+樹的葉子節點存儲的是數據本身,輔助索引葉子節點存儲的數據是主鍵的值,當用輔助索引查詢值的時候會找到主鍵的值,再去主鍵索引的B+查詢一遍。    因爲主鍵索引葉子結點存放的是全部數據,所以也就是聚簇索引。

 

在innodb中,表數據文件本身是按照B+ Tree組織的一個索引結構,在data域存放了完整的數據記錄,key是數據的主鍵,所以innodb表數據文件的本身就是主索引。

在innodb中必須要有主鍵,如果沒有顯示的指定主鍵,Mysql系統會自動選擇一個可以唯一標識數據記錄的列作爲主鍵,如果不存在這種列,則mysql自動爲innodb表生成一個隱含字段作爲自增主鍵,這個字段佔用6個字節,是長整型類型。

 

MyISAM:
在MyISAM中的索引是非聚簇索引,葉子結點(data域)存放的數據的地址而不是數據本身,當訪問數據的時候要到數據存放的地址中去取數據。    在MyISAM中 主索引和輔助索引在結構上沒有區別 data域存放 是數據的地址, 區別是主索引要求Key是唯一的,輔助索引的Key是可以重複的。

 

以上是InNoDB存儲引擎的索引 的區別。

 

Innodb存儲引擎索引需要注意的點:

  • 不要使用過長字段作爲主鍵,因爲輔助索引的域值存放的是主鍵,過長的主鍵字段會使得輔助索引變得過大。
  • 不要用非單調的字段作爲主鍵,在innodb中數據文件本身就是一顆B+樹,在插入新記錄的時候數據文件爲了維持B+樹的特性需要不斷的分裂合併調整,非常的低效。  使用自增字段作爲主鍵效率會非常的高。 

 

兩個存儲引擎除了索引區別其他地方也有區別

  • InNoDB支持事物,MyISAM不支持事物,對於Innodb每條sql語句都會默認的封裝成事物進行提交,當每條語句都是一個事物,執行的時候會影響效率,可以將多條sql 語句放在begin 和 commit 之間,組成一個事物;
  • Innodb支持外鍵,Myisam不支持外鍵
  • Innodb支持行鎖     Myisam支持表鎖

 

在應用上:

如果表的修改要求較高的事物處理,可以選擇Innodb存儲引擎。

如果查詢較多的表可以選擇Myisam存儲引擎。

 

 

 

索引有唯一主鍵索引、自增主鍵索引、輔助索引、覆蓋所以、組合索引、

還有索引下推機制

回表:
當在輔助索引查詢一個範圍的值的時候,會在輔助索引查詢到符合條件的記錄,再去到主鍵索引查詢對應主鍵的data域的值。由於有的例子需要查詢的數據只有主鍵索引上有,所以不得不回表。回到主鍵索引搜索的過程,稱爲回表,輔助索引查詢一次符合條件就會回到主鍵索引,這就是一次回表,查詢多次多次符合條件就會回表多次。

覆蓋索引
如果查詢語句 select id form t where k between 2 and 5 ,這個時候只需要查詢id的值,id的值如果在 k 這個輔助索引的索引樹上,可以直接提供查詢的結果,不需要回表,輔助索引 k 已經覆蓋了我們的查詢需求,成爲覆蓋索引。     

tip,用關鍵字key和index都可以創建索引

聯合索引:
當有一個高頻的查詢,通過學號查詢名字,可以將學號和名字建立聯合索引,高頻的查詢請求用到了覆蓋索引,不需要進行一個回表,減少了查詢語句的執行時間。

最左前綴原則:
查詢名字的時候,比如查詢名字第一個開頭的字是李,"where name like '李%' ", 然後找到第一個符合條件的結果,向後遍歷,知道不滿足條件爲止。只要滿足最左前綴就可以按利用索引快速的檢測,最左前綴可以是聯合索引的前N個字段,也可以是字符串索引的前K個字段。

索引下推:
在mysql的5.6版本之後,出現了索引下推優化(index condition pushdown)。
一個例子,如果要查詢學校裏姓閆的年齡小於20歲的男生的所有信息,用到索引下推的優化會減少回表的次數。
在索引遍歷的時候會對索引包含的字段作出判斷,過濾掉不滿足條件的記錄,比如聯合索引的名字中帶閆且年齡>=20的的記錄直接過濾掉, 減少了回表的次數。

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章