索引是對資料庫表中一列或多列的值進行排序的一種結構,使用索引可快速訪問資料庫表中的特定資訊。如果想按特定職員的姓來查詢他或她,則與在表中搜尋所有的行相比,索引有助於更快地獲取資訊。在 mysql 中,主要有四種型別的索引,分別為:b-tree 索引,hash 索引,fulltext 索引和 rtree 索引,索引的乙個主要目的就是加快檢索表中資料,亦即能協助資訊搜尋者盡快的找到符合限制條件的記錄id的輔助資料結構。
為啥索引能夠提高查詢的速度呢?
平常我們說建立索引,其實就是把資料根據表中一列或者多列進行排序,然後製作了乙個目錄,就相當於我們查字典時,根據前面的拼音目錄去檢索,而不是一頁一頁的去找,這時間差距可不是一點半點,我們說建立索引就是編寫字典時建立目錄,而根據索引查新就是根據字母目錄查詢字。
比如執行下面的sql語句:
select * from student where name='呂布';
如果沒有對name列建立索引,mysql會先遍歷雙向鍊錶,找到資料所在的頁,由於不是根據主鍵查詢,只能遍歷所在頁的單鏈表,一條一條的查詢name是呂布的同學,毫無疑問,這樣的操作時極慢的。
如果有了索引呢,只需要通過目錄就可以很快地定位到對應的頁上了
前面說過,索引就相當於乙個資料的目錄,那這個目錄不是憑空產生的呀,它是需要去維護的,這個維護的操作就是在進行刪除,更新,插入資料的同時,還需要更新索引,這都是需要消耗資源的。
索引的底層資料結構是b+樹,是一種矮矮胖胖的樹,b+樹是一顆平衡樹,如果我們對這顆樹增刪改的話,那肯定會破壞它的原有結構。
要維持平衡樹,就必須做額外的工作。正因為這些額外的工作開銷,導致索引會降低增刪改的速度。
最左匹配原則是針對聯合索引來說的,最左優先,以最左邊的為起點任何連續的索引都能匹配上。同時遇到範圍查詢(>、<、between、like)就會停止匹配。列的排列順序決定了可命中索引的列數。
例如:比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,因為c欄位是乙個範圍查詢,它之後的字段會停止匹配。
hash 索引在 mysql 中使用的並不是很多,目前主要是 memory 儲存引擎使用,而且在 memory 儲存引擎中將 hash 索引作為預設的索引型別。所謂 hash 索引,實際上就是通過一定的 hash 演算法,將需要索引的鍵值進行 hash 運算,然後將得到的 hash 值存入乙個 hash 表中。然後每次需要檢索的時候,都會將檢索條件進行相同演算法的 hash 運算,然後再和 hash 表中的 hash 值進行比較並得出相應的資訊。雜湊索引雖然比b+索引高得多,但是它也有以下致命缺點:
hash 索引僅僅只能滿足「=」,「in」和「<=>」查詢,不能使用範圍查詢;
由於 hash 索引所比較的是進行 hash 運算之後的 hash 值,所以 hash 索引只能用於等值的過濾,而不能用於基於範圍的過濾,因為經過相應的 hash 演算法處理之後的 hash 值的大小關係,並不能保證還和 hash 運算之前完全一樣。
hash 索引無法利用索引完成排序操作;
由於 hash 索引中存放的是經過 hash 計算之後的 hash 值,而且** hash 值的大小關係並不一定和 hash 運算前的鍵值的完全一樣**,所以資料庫無法利用索引的資料來避免任何和排序運算;
hash 索引不能利用部分索引鍵查詢;
對於組合索引,hash 索引在計算 hash 值的時候是組合索引鍵合併之後再一起計算 hash 值,而不是單獨計算 hash 值,所以當我們通過組合索引的前面乙個或幾個索引鍵進行查詢的時候,hash 索引也無法被利用到;
hash 索引在任何時候都不能避免表掃瞄;
前面我們已經知道,hash 索引是將索引鍵通過 hash 運算之後,將 hash 運算結果的 hash 值和所對應的行指標資訊存放於乙個 hash 表中,而且由於存在不同索引鍵對應相同 hash 值的可能,所以即使我們僅僅取滿足某個 hash 鍵值的資料的記錄條數,都無法直接從hash 索引中直接完成查詢,還是要通過訪問表中的實際資料進行相應的比較而得到相應的結果。
hash 索引遇到大量 hash 值相等的情況後效能並不一定就會比 b-tree 索引高;
對於選擇性比較低的索引鍵,如果我們建立 hash 索引,那麼我們將會存在大量記錄指標資訊存與同乙個 hash 值相關連。即雜湊碰撞,這樣要定位某一條記錄的時候就會非常的麻煩,可能會浪費非常多次表資料的訪問,而造成整體效能的地下。
Mysql Mysql索引詳解
索引概述 mysql資料庫系統除了儲存資料之外,為了能夠提高對資料的快速訪問,mysql為此設計了索引,mysql索引是一種可以快速提高mysql高效查詢資料的一種資料結構。舉個例子索引就跟我們的書本的目錄一樣,如果一本書沒有目錄,那麼你要找想看的地方,那會是相當費勁的,只能一頁頁去翻,而資料庫的索...
索引 mysql MySql索引那些事
概述一 什麼是索引 資料庫索引,是資料庫管理系統中乙個排序的資料結構,以協助快速查詢 更新資料庫表中資料。就像我們以前用的新華字典的目錄一樣,能幫助我們快速查詢到某乙個字。二 索引的分類 分類角度索引名稱 資料結構b 樹,hash索引,r tree等 儲存層面聚簇索引,非聚簇索引 邏輯層面主鍵索引,...
mysql mysql中的索引
2019獨角獸企業重金招聘python工程師標準 普通索引 唯一性索引 unique約束設定唯一索引,主鍵是一種特殊的唯一索引。全文索引 查詢較大資料量時,使用全文索引可以提高查詢速度。單列索引 包括以上三個索引 多列索引 空間索引 create table table name 屬性名 資料型別 ...