在談論索引優化之前,要先了解一下他的定義以及作用。
索引是一種方便資料庫查詢的排好順序的一種資料結構,其相當於圖書目錄對於整本書,起到的方便查詢的作用。
因為查詢過程是在記憶體中完成的,而資料儲存都是在磁碟上,每一次讀取節點就相當於做一次i/o即訪問一次硬碟,由於硬碟讀取速率的限制,每次的i/o操作會消耗大量的時間,因此查詢效率的乙個重要指標就是盡量少的i/o操作。
幾種可供選擇的資料結構:
二叉樹
紅黑樹(平衡二叉樹)
b樹b+樹
hash
二叉樹作為索引結構會導致層數過多,查詢次數太多,查詢效率極低。
紅黑樹是二叉樹的改進,可以自動平衡資料,使層數有所下降,然而效率還是很低。
b+樹和b樹的主要區別有三點:
1.在b+樹中,key 的副本儲存在內部節點,真正的 key 和 data 儲存在葉子節點上 。
n 個 key 值的節點指標域為 n 而不是 n+1。
新增了葉子節點間的指標,大大增加區間訪問性,可使用在範圍查詢,而b樹每個節點 key 和 data 在一起,則無法區間查詢。
其主要結構如下:
b+樹一般為每個節點分配4k/8k/16k的大小,key值一般為bigint型別,占用8b,每個節點指標占用6b,這樣每個節點最多可儲存1170+的key值,最後一層的葉子結點的資料大小假設為1k,那麼最後一層的資料量最少是16個。對於3層的b樹,可查詢的資料量就在16x1170x1170=21,902,400個。這就意味著對於兩千萬甚至更大的數量級資料的查詢僅僅需要3次i/o就可以完成。
實際上mysql的大部分引擎如myisam和innodb就採用的b+樹的資料結構。
雜湊索引就是採用一定的雜湊演算法,把鍵值換算成新的雜湊值,檢索時不需要類似b+樹那樣從根節點到葉子節點逐級查詢,只需一次雜湊演算法即可立刻定位到相應的位置,速度非常快。至於為什麼不採用這種結構,就在於它無法實現邏輯性條件的查詢,而且雜湊索引也沒辦法利用索引完成排序,以及like 『***%』 這樣的部分模糊查詢。在mysql中,只有heap/memory引擎表才能顯式支援雜湊索引(ndb也支援,但這個不常用),innodb引擎的自適應雜湊索引(adaptive hash index)不在此列,因為這不是建立索引時可指定的。還需要注意到:heap/memory引擎表在mysql例項重啟後,資料會丟失。
mysql常用的索引型別有如下幾種:
1)普通索引index :加速查詢
2)唯一索引
主鍵索引:primary key :加速查詢+約束(不為空且唯一)
唯一索引:unique:加速查詢+約束 (唯一)
3)聯合索引
-primary key(id,name):聯合主鍵索引
-unique(id,name):聯合唯一索引
-index(id,name):聯合普通索引
4)全文索引fulltext :用於搜尋很長一篇文章的時候,效果最好。
普通索引:這是最基本的索引型別,它沒有唯一性之類的限制,可依據情況適當新增。
主鍵索引:主鍵是一種唯一性索引,每個表只能有乙個主鍵,在單錶查詢中,primary主鍵索引與unique唯一索引的檢索效率並沒有多大的區別,但在關聯查詢中,primary主鍵索引的檢索速度要高於unique唯一索引。
唯一索引:這種索引和前面的「普通索引」基本相同,但有乙個區別:索引列的所有值都只能出現一次,即必須唯一。
聯合索引:聯合索引的使用一般依據於具體的業務邏輯,可以將多個字段建立成其他型別的索引,比如確定乙個老師的資訊就可以把班級和教授科目聯絡在一起,組合成聯合唯一索引,保證邏輯正確。
全文索引:mysql從3.23版開始支援全文索引和全文檢索。全文索引只可以在varchar或者text型別的列上建立,且全文索引的關鍵字不支援
中文字元,如果需要新增中文索引就必須借助於外掛程式。
在介紹索引優化方法之前先介紹乙個explain方法,此方法返回mysql查詢語句的預處理內容。語法為explain 你的查詢語句
。
具體優化內容很多,在這推薦一篇部落格:
mysql 效能優化,索引和查詢優化
mysql 優化 聚集索引 mysql 索引優化
一.聚集索引 clustered index innodb預設依據主鍵列聚集,myisam不使用 特點 b樹每個葉子包含實際資料行,資料按照索引順序地儲存在物理頁上。優點 1.範圍查詢,獲取指定id的全部資料只需從磁碟讀取少量資料頁 如果不使用聚集索引,每條資料可能引起一次磁碟io。2.由於索引和資...
mysql索引優化原則 MySQL 索引優化原則
索引優化原則 1 最左字首匹配原則,聯合索引,mysql會從做向右匹配直到遇到範圍查詢 3 and d 4 如果建立 a,b,c,d 順序的索引,d是用不到索引的,如果建立 a,b,d,c 的索引則都可以用到,a,b,d的順序可以任意調整。2 和in可以亂序,比如a 1 and b 2 and c ...
mysql索引優化原則 MySQL索引優化
mysql官方對索引的定義 索引是幫助mysql高效獲取資料的資料結構。索引是在儲存引擎中實現的,所以每種儲存引擎中的索引都不一樣。如myisam和innodb儲存引擎只支援btree索引 memory和heap儲存引擎可以支援hash和btree索引。這裡僅針對常用的innodb儲存引擎所支援的b...