MySQL調優系列:如何正確的使用MySQL索引

MySQL索引使用詳解,原理分析

[提前聲明]
文章由作者:張耀峯 結合自己生產中的使用經驗整理,最終形成簡單易懂的文章
寫作不易,轉載請註明,謝謝!
大數據代碼案例地址: https://github.com/Mydreamandreality/sparkResearch


在innodb引擎中,總共有四種索引類型,兩種索引方法,我主要講一下生產中索引的選擇,數據結構的選擇

索引命中率,SQL執行計劃可以查看我的上一篇文章

索引類型:

  • 1、Normal 普通索引
  • 2、Unique 唯一索引
  • 3、Full Text 全文索引
  • 4、SPATIAL 空間索引

索引方法:

  • 1、btree索引方法
  • 2、hash索引方法

索引類型詳解:

  • 1、首先說Normal這個索引類型,是最常用的一種索引類型了,也是最基本的一種索引類型,它本身沒有任何的限制,你可以針對某個字段設置Normal,也可以做聯合索引,在做單條件查詢、多條件查詢啊,或者其它需要left join操作的時候,MySQL優化器就會自動使用該索引類型,來優化查詢速度,那如果我們要知道這個索引到底生效沒有,可以使用explain命令來查看SQL執行計劃,SQL執行計劃的詳解可以看我的上一篇博客哦
  • 2、Unique這個顧名思義就是唯一索引,唯一索引就是在普通索引的基礎上增加了唯一約束,我在百萬級數據下測試,和Normal對比沒有太大的性能差異,這種索引的應用場景也挺多的,比如你數據有個字段需要索引,而且這個字段的值必須是唯一的,那用Unique索引是比較好的選擇
  • 3、Full Text全文索引,講道理,一般需要全文索引的我們都上Elasticsearch了,MySQL這個裏面的全文索引用的確實不多,不過全文索引的基本單位肯定是詞,MySQL這裏面的分詞器不知道有沒有es那麼強大,總之這種索引的應用場景就是某個字段存的大文本,你就可以使用Full Text索引
  • 4、SPATIAL空間索引,說實話這個沒用過,因爲這個索引在innodb引擎中沒法用的,需要在MYISAM引擎中空間數據類型字段上才能使用,MYSQL中的空間數據類型有4種,分別是GEOMETRY、POINT、LINESTRING、POLYGON,MYSQL使用SPATIAL關鍵字進行擴展,使得能夠用於創建正規索引類型的語法創建空間索引,創建空間索引的列,必須將其聲明爲NOT NULL

索引方法詳解:

索引方法這塊MySQL是支持兩種

  • 1、BTREE就是B+樹,用的最多的應該就是這種了
  • 2、Hash就是K,V的數據結構,這種對範圍查找,節點查找支持的不是很好

索引是啥?

大家有沒有想過,索引是啥?爲啥合理的加了索引後查詢效率變的這麼高

其實說白了,索引就是一種數據結構,它的作用就是優化我們的查詢,就像是MySQL中B+樹實現的索引,B+樹就是一種數據結構,你沒有加索引的時候查詢一個數據,是需要掃描整張表,做一次全表掃描後再去匹配數據,這數據量一大不就涼了嗎?索引相當於字典的音序表,如果要查某個數據,直接在音序表中找k就可以了,效率提升是很高的

那爲啥說咱們推薦使用B+樹的數據結構,hash索引和B樹,完全平衡二叉樹不行嗎?

首先咱說hash索引,這種索引查找速度賊快,但是難受就難受在它不支持範圍查找,比如大於等於這種,你想嘛,kv的怎麼支持這種查詢,所以一般情況下很少使用Hash索引

然後b樹,其實光看名字哦,b樹和b+樹有個毛區別,不就多個+嘛,其實b+樹非葉子節點冗餘進了葉子節點,b+樹葉子節點之間有指針,這樣找大於什麼或者小於什麼就會特別快,是一種空間換時間的方案

平衡二叉樹是支持範圍查找的啊,爲啥不用它,因爲b+數(b數也可以)一個節點可以存放多個元素,這就導致啥?你就抽象點想,咱有兩棵樹,由於b+樹一個節點存多個元素,是不是樹長得比二叉樹低,所以元素查找也要更快,減少了一定的io操作

。。。等等等等,索引可以說的點太多太多了,差不多瞭解一些就行了,有空再去慢慢深究

索引使用注意

  • 1、索引在數據量大的時候纔會有明顯的效果,如果系統中數據量不大,沒必要生成索引,浪費磁盤空間
  • 2、索引雖然會提高查詢速度,但是會降低更新速度
  • 3、我聽過一些比較危險的想法。。我不知道索引有沒有生效,反正我給所有字段都加了索引。。。這種太嚇人了,建立索引會佔用磁盤空間的索引文件,你正常建立索引沒啥事,不能過度使用索引
  • 4、根據自己的業務場景,選擇合適的索引
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章