通過建立索引可以有效的提高查詢效能。索引也分為很多種(聚集、非聚集、聯合索引等),資料結構主要有雜湊索引和b+樹等,雜湊索引在單個查詢效能上很強大,但不適合做範圍查詢。以下討論主要是建立在b+樹索引上面的。
索引一般採用b+樹的資料結構,b+樹是乙個有序的樹形結構,每個父節點可以有多個子節點,子節點之間也通過指標相互連線。
建立索引需要注意的地方:
a. 盡量不要在字段型別長度太大的字段上建立索引,例如 text;
b. 不要在取值範圍太小的字段建立索引;例如 性別;
c. 不要在不經常進行where查詢過濾的字段建立索引;
d. 乙個表不能建立過多的索引;維護索引需要消耗資源;
e. 資料量太少也不需要建索引,有時候反而效能更低。當然這點效能可以忽略不計;
那麼如何選擇乙個有效、合適的索引呢?首先讓我們先了解一下它們。
1、聚集索引(也叫 聚簇索引、主鍵索引)
乙個表只能擁有乙個聚集索引,而且是建立在主鍵上面的,主鍵一般採用自增id和guid等方式。自增id由於是有序的,而且占用位元組較少。所以在效能和空間上都比較有優勢。
表中的資料儲存在聚集索引的葉子節點中。在利用聚集索引做查詢的時候只需要根據索引字段找到對應的節點就可以查詢到相應的資料。因為索引是有序的。 所以在範圍查詢的效率上也是很高的。只需要找到第乙個節點和最後乙個節點。其次可以利用索引字段進行order by 和group by操作,效率都是很高的。
2、 非聚集索引(也叫 非聚簇索引、二級索引)
乙個表只能擁有多個非聚集索引,非聚集索引的葉子節點只儲存聚集索引的索引字段值(主鍵列發的值)。
所以在利用非聚集索引做查詢的時候通常會涉及到回表操作;這是因為在根據非聚集索引中查詢只能得到主鍵列的值,然後需要根據主鍵列的值去查詢聚集索引,最後才能得到我們想要的資料。
有時候也是可以不需要回表操作的, 比如:select id from table where index=1 ; 這是因為在非聚集索引中已經能獲取到我們想要的資料了,這種方式被稱為覆蓋索引。
3、 聯合索引
乙個索引中可以包含多個字段,這種索引就叫做聯合索引。
聯合索引需要注意的就是字段順序問題。在查詢裡面必須要使用聯合索引中的第乙個字段;
例如:索引包含三個字段(name,age,number);
select * from table where name ="小熊" ; --走索引
select * from table where name like "小%" ; --走索引
select * from table where age=18; --不走索引
如果查詢結果中也只包含這三列是不用做回表查詢的:例如select name,age,number from table where name ="小熊" ;
利用覆蓋索引可以減少樹的搜尋次數,提高查詢效能。
4、 普通索引和唯一索引
4.1 查詢方面(唯一索引更佳,但差距非常小)
a. 普通索引:在查詢到第一條記錄後還需要查詢下一條記錄,直到遇到不滿足條件的記錄為止;由於mysql讀取是根據資料頁來讀取的(16kb),所以普通索引在查詢過程中可能需要讀取多個資料頁;
b. 唯一索引:由於字段值的唯一性,查詢到第乙個滿足條件的記錄後就可以停止查詢;更適合做查詢操作
4.2 更新(普通索引更佳)
a. 普通索引:由於普通索引在更新是時候是可以利用change buffer來提高效能的,但對於更新後立刻查詢的業務場景應該關閉change buffer;否則會增加chang buffer的維護代價。更適合做更新操作
b. 唯一索引:唯一索引的更新不能使用change buffer。而且每次更新操作的時候先要判斷是否已經存在相同的字段值。相對普通索引來講增加了資料頁的讀取和判斷操作。
資料庫索引(聚集與非聚集)
mysql官方對索引的定義為 索引 index 是幫助mysql高效獲取資料的資料結構 索引是用來對資料表中的乙個列或多個列進行排序的資料結構,在這裡資料庫用的平衡樹,b tree和b tree 平衡多路查詢樹 例如 select from table1 where id 10000如果沒有索引,那...
聚集索引和非聚集索引的區別底層 資料庫 索引相關
在資料庫中,索引的含義與日常意義上的 索引 一詞並無多大區別 想想小時候查字典 它是用於提高資料庫表資料訪問速度的資料庫物件。總而言之,索引是乙個排序的列表,在這個列表中儲存著索引的值和包含這個值的資料所在行的實體地址,在資料十分龐大的時候,索引可以大大加快查詢的速度,這是因為使用索引後可以不用掃瞄...
mysql聚集索引 MySQL索引之聚集索引介紹
在mysql裡,聚集索引和非聚集索引分別是什麼意思,有什麼區別?在mysql中,innodb引擎表是 聚集 索引組織表 clustered index organize table 而myisam引擎表則是堆組織表 heap organize table 也有人把聚集索引稱為聚簇索引。當然了,聚集索...