mysql索引詳解

2022-05-16 23:55:06 字數 3235 閱讀 1800

參考:

(深入理解mysql索引底層原理)

mysql目前主要有以下幾種索引型別:fulltext,hash,btree,rtree。

1. fulltext

即為全文索引,目前只有myisam引擎支援。其可以在create table ,alter table ,create index 使用,不過目前只有 char、varchar ,text 列上可以建立全文索引。

全文索引並不是和myisam一起誕生的,它的出現是為了解決where name like 「%word%"這類針對文字的模糊查詢效率較低的問題。

2. hash

由於hash的唯一(幾乎100%的唯一)及類似鍵值對的形式,很適合作為索引。

hash索引可以一次定位,不需要像樹形索引那樣逐層查詢,因此具有極高的效率。但是,這種高效是有條件的,即只在「=」和「in」條件下高效,對於範圍查詢、排序及組合索引仍然效率不高。

3. btree

btree索引就是一種將索引值按一定的演算法,存入乙個樹形的資料結構中(二叉樹),每次查詢都是從樹的入口root開始,依次遍歷node,獲取leaf。這是mysql裡預設和最常用的索引型別。

4. rtree

rtree在mysql很少使用,僅支援geometry資料型別,支援該型別的儲存引擎只有myisam、bdb、innodb、ndb、archive幾種。

相對於btree,rtree的優勢在於範圍查詢

索引就是把指定列放在乙個資料結構(索引方式)裡面便於查詢

普通索引:僅加速查詢

唯一索引:加速查詢 + 列值唯一(可以有null)

主鍵索引:加速查詢 + 列值唯一(不可以有null)+ 表中只有乙個

組合索引:多列值組成乙個索引,專門用於組合搜尋,其效率大於索引合併

全文索引:對文字的內容進行分詞,進行搜尋

ps.索引合併,使用多個單列索引組合搜尋

覆蓋索引,select的資料列只用從索引中就能夠取得,不必讀取資料行,換句話說查詢列要被所建的索引覆蓋

1、表的主鍵、外來鍵必須有索引; 

2、資料量超過300的表應該有索引; 

3、經常與其他表進行連線的表,在連線欄位上應該建立索引; 

4、經常出現在where子句中的字段,特別是大表的字段,應該建立索引; 

5、索引應該建在選擇性高的字段上; 

6、索引應該建在小字段上,對於大的文字字段甚至超長字段,不要建索引; 

7、復合索引的建立需要進行仔細分析;盡量考慮用單字段索引代替:

a、正確選擇復合索引中的主列字段,一般是選擇性較好的字段;

b、復合索引的幾個字段是否經常同時以and方式出現在where子句中?單字段查詢是否極少甚至沒有?如果是,則可以建立復合索引;否則考慮單字段索引;

c、如果復合索引中包含的字段經常單獨出現在where子句中,則分解為多個單字段索引;

e、如果既有單字段索引,又有這幾個欄位上的復合索引,一般可以刪除復合索引;

8、頻繁進行資料操作的表,不要建立太多的索引; 

9、刪除無用的索引,避免對執行計畫造成負面影響;

以上是一些普遍的建立索引時的判斷依據。 

索引的建立必須慎重,對每個索引的必要性都應該經過仔細分析,要有建立的依據。 

因為太多的索引與不充分、不正確的索引對效能都毫無益處:在表上建立的每個索引都會增加儲存開銷,索引對於插入、刪除、更新操作也會增加處理上的開銷。 另外,過多的復合索引,在有單字段索引的情況下,一般都是沒有存在價值的;相反,還會降低資料增加刪除時的效能,特別是對頻繁更新的表來說,負面影響更大。 

總的來說,小型表肯定不建索引, 

或者資料庫記錄在億條資料級以上,還是建議使用非關係型資料庫。 

還有些特殊欄位的資料庫,比如blob,clob欄位肯定也不適合建索引。 

其實這個問題更感覺偏向於做軟體專案的一種經驗。

設計好mysql的索引可以讓你的資料庫飛起來,大大的提高資料庫效率。設計mysql索引的時候有一下幾點注意:

1,建立索引

對於查詢佔主要的應用來說,索引顯得尤為重要。很多時候效能問題很簡單的就是因為我們忘了新增索引而造成的,或者說沒有新增更為有效的索引導致。如果不加索引的話,那麼查詢任何哪怕只是一條特定的資料都會進行一次全表掃瞄,如果一張表的資料量很大而符合條件的結果又很少,那麼不加索引會引起致命的效能下降。但是也不是什麼情況都非得建索引不可,比如性別可能就只有兩個值,建索引不僅沒什麼優勢,還會影響到更新速度,這被稱為過度索引。

2,復合索引

比如有一條語句是這樣的:select * from users where area=』beijing』 and age=22; 

如果我們是在area和age上分別建立單個索引的話,由於mysql查詢每次只能使用乙個索引,所以雖然這樣已經相對不做索引時全表掃瞄提高了很多效 

率,但是如果在area、age兩列上建立復合索引的話將帶來更高的效率。如果我們建立了(area, age, 

salary)的復合索引,那麼其實相當於建立了(area,age,salary)、(area,age)、(area)三個索引,這被稱為最佳左字首 

特性。因此我們在建立復合索引時應該將最常用作限制條件的列放在最左邊,依次遞減。

3,索引不會包含有null值的列

只要列中包含有null值都將不會被包含在索引中,復合索引中只要有一列含有null值,那麼這一列對於此復合索引就是無效的。所以我們在資料庫設計時不要讓字段的預設值為null。

4,使用短索引

對串列進行索引,如果可能應該指定乙個字首長度。例如,如果有乙個char(255)的 列,如果在前10 個或20 個字元內,多數值是惟一的,那麼就不要對整個列進行索引。短索引不僅可以提高查詢速度而且可以節省磁碟空間和i/o操作。

5,排序的索引問題

mysql查詢只使用乙個索引,因此如果where子句中已經使用了索引的話,那麼order by中的列是不會使用索引的。因此資料庫預設排序可以符合要求的情況下不要使用排序操作;盡量不要包含多個列的排序,如果需要最好給這些列建立復合索引。

6,like語句操作

一般情況下不鼓勵使用like操作,如果非使用不可,如何使用也是乙個問題。like 「%a%」 不會使用索引而like 「aaa%」可以使用索引。

7,不要在列上進行運算

select * from users where

year(adddate)

8,不使用not in和操作

not in和操作都不會使用索引將進行全表掃瞄。not in可以not exists代替;

MySQL聚集索引詳解 mysql 索引詳解

直接起飛 1.什麼是索引?索引是幫助mysql高效獲取資料的排好序的資料結構。2.索引的資料結構?為什麼選這種結構?假設我們現在這裡有一張表 以下情況都是innodb儲存引擎 idnumber 如果mysql沒有索引這種結構,那麼我們如果查詢number為51的這行記錄,那麼mysql就要從上往下掃...

MySQL聚集索引詳解 mysql索引詳解

資料結構分,有b tree索引 b tree 雜湊索引 r tree索引等。按資料塊的順序和索引節點的邏輯順序是否一致可以分為聚集索引和非聚集索引。聚集索引由於物理塊連續,在範圍掃瞄的時候可以減少磁頭尋道時間,因而比非聚集索引高效。幾種索引型別的選擇 primary 主鍵索引。unique 唯一索引...

mysql 索引定義 MySQL 索引詳解

普通索引 唯一索引和主索引 1.普通索引 普通索引 由關鍵字key或index定義的索引 的唯一任務是加快對資料的訪問速度。因此,應該只為那些最經常出現在查詢條件 where column 或排序條件 order by column 中的資料列建立索引。只要有可能,就應該選擇乙個資料最整齊 最緊湊的...