1. 程式人生 > >mysql,簡單介紹一下索引

mysql,簡單介紹一下索引

漢字很多,人力有時盡,人不可能記住所有的字,為了解決這個問題,於是有了字典。資料庫裡的資料很多,為了方便檢索,於是有了索引。

索引,是一種資料結構,在這種資料結構中實現了高階的查詢演算法,索引可以幫助我們高效地獲取資料,提高查詢效率。

既然索引有這樣的好處,那我們是不是每個欄位都該建立索引呢?

當然是不,物極必反,索引是需要佔用空間的,而且索引本身也不小,不能儲存在記憶體空間,是存放在磁碟中的。

如果每個欄位都建立索引,後果可想而知。

討論索引的時候,如果沒有特別的指明型別,一般都是B樹索引。BTree索引可以查閱相關資料瞭解下,不贅述了。

除了B樹索引,另外還有雜湊索引等。

索引有哪些分類?

1.單值索引

單值索引是指一個索引只包含一個欄位,一個表可以建立多個單值索引,但也不宜過多。

2.唯一索引

主鍵建立後一定包含一個唯一索引;但唯一索引不一定是主鍵,允許有空值,一個表可以建立多個唯一索引。

3.複合索引

因為一個查詢一次至多隻能使用一個索引,所以,如果都使用單值索引,在資料量較大的情況下,不能很好的區分資料, 於是引入了複合索引。

需要注意的是:複合索引是有順序的! 舉例說明一下。


例如,user表裡有id,name,sex三個欄位,並且我們建立了name+sex的複合字段。
select * from user where name=x and sex=x;
這個情況是允許使用上面的複合索引的。

select 
* from user where name=x; 這個情況也是允許使用上面的複合索引的。 select * from user where sex=x and name=x; 這種情況不允許使用,複合索引有順序就是指這個意思。 select * from user where sex=x; 這種情況也不允許使用索引哦。
複合索引是遵循向左原則的,只要在查詢的時候,是按照複合索引從左到右的順序依次查詢 不管查詢條件是否完全滿足所有的符合索引的列,都可以使用部分的符合索引;

選擇哪些列建立索引?

1.查詢較為頻繁的欄位應該建立索引; 2.唯一性太差的欄位不應該建立索引,就算這個欄位經常作為查詢條件; 3.更新頻繁的欄位不應該建立索引,索引是需要維護成本的; 4.有where條件時才會走索引,所以如果這個列不會作為where的查詢條件,沒有必要為這個欄位建立索引;

不走索引的情況

在以前的工作中,有一次發現在特殊的情況下,即使你建立了索引,並且也在where加上了索引條件,查詢過程中還是沒有走索引。例如: 1.使用不等於(!= 或者<>)的時候MySQL 無法使用索引 2.like 後面的字元當首位為萬用字元時不走索引;如    like "北%",這種情況是走索引的    like "%北",這種情況是不走索引的 3.索引欄位 is null 不走索引; 4.索引欄位前加了函式或參加了運算不走索引;