首頁 >資料庫 >mysql教程 >Mysql索引優化方法

Mysql索引優化方法

小云云
小云云原創
2018-02-09 15:41:492493瀏覽
############################################################################################################################################################.不限於Java Web領域的技術分享,希望此公眾號能成為你程式設計路上的良師益友。 ############                            #######                     ##########

本文主要跟大家分享Mysql索引優化方法,希望能幫助大家。索引是儲存引擎用於快速找到記錄的一種資料結構。尤其是當表的資料量越來越大的時候,正確的索引對查詢效能的提升尤為明顯。但在日常工作中,索引卻常被忽略,甚至被誤解。本文將為大家簡單介紹下Mysql索引優化的原理與注意事項。

一、索引的類型

1)B-Tree索引

B-Tree索引是用的最多的索引類型了,而且大多數儲存引擎都支援B -Tree索引。

B-Tree本身是一種資料結構,其是為磁碟或其他直接存取的輔助設備而設計的一種平衡搜尋樹。 Mysql中的B-Tree索引通常是B-Tree的變體B+Tree實現的。其結構如下:

Mysql索引優化方法

B+Tree的特點是,資料都儲存在葉子節點,並且每個葉子節點的資料都是以相同順序(升序或降序)排列存放的,再者相鄰的葉子節點都用指針連接在一點,這種結構非常適合範圍查找。

B-Tree索引能夠顯著加快存取資料的速度,因為儲存引擎不再需要進行全表掃描來獲取所需的數據,而是從索引的根節點逐層往下進行搜索,這大大縮小了儲存引擎掃描資料的範圍,因此對查詢速度的提升非常明顯。

2)Hash索引

Hash索引,顧名思義,就是透過哈希表實現的索引。其特點是只有精確匹配索引的所有欄位才有效。對於每一行數據,儲存引擎都會對所有索引列計算一個哈希碼,Hash索引把哈希碼儲存在索引中,同時在哈希表中保存指向每個資料行的指標。

在Mysql中,目前只有Memory引擎明確支援Hash索引,而且由於Hash索引不支援範圍查找,也不支援排序,更不支援部分索引列比對查找,所以Hash索引用的比較少。

下文將著重於B-Tree索引的用法。

為了下文敘述方便,我們將假設有一個user表,其欄位如下:

id:bigint類型,主鍵

name:varchar類型

age:int型別

interest:varchar型別

並且在name、age、interest上建立了一個聯合索引index_1,索引順序為(name ,age,interest),這個索引順序非常重要,後文將會提及。

二、B-Tree索引的用法

1)全值匹配

全值匹配指的是和索引中所有列進行匹配,如對上述user表查詢where name='aaa' and age=20 and interest='籃球' 是所有可以使用到索引的欄位的。

2)符合最左前綴

符合最左前綴是指只使用到多列索引的左邊若干列。如對上述user表查詢 where name = 'aaa' 是可以使用到索引的,並且只使用到索引的第一列。

3)符合列前綴

符合列前綴是指只符合某一列的開頭部分,如對上述user表查詢where name like 'aaa%' 是可以使用到索引的,注意是符合列的開頭部分,如果查詢的是where name like '%aaa'就不能使用到索引了。

4)符合範圍值

如對上述user表查詢 where name > 'aaa' and name < 'bbb' 也是可以使用到索引的。

5)精確地符合某一列並且範圍符合另一列

如對上述user表查詢 where name='aaa' and age >10,可以使用到索引,並且使用到索引的前2列。

三、B-Tree索引的限制

1)如果不是依照索引的最左列開始查找,則無法使用索引。

如對上述user表查詢 where age=20則無法使用到索引,因為age不是索引列中最左邊的資料列。

2)不能跳過索引中的欄位。

如對上述user表查詢where name='aaa' and interest='足球',則只能使用到索引的第一列,因為where條件中沒有包含age這一列。

相關推薦:

mysql的索引最佳化如何使用

MySQL進階十三— —透過索引最佳化SQL

MySQL Order By索引最佳化方法

以上是Mysql索引優化方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn