mysql索引簡介,及失效場景介紹

2021-10-07 14:18:44 字數 2873 閱讀 3662

mysql索引的概念

索引是一種特殊的檔案(innodb資料表上的索引是表空間的乙個組成部分),它們包含著對資料表裡所有記錄的引用指標。更通俗的說,資料庫索引好比是一本書前面的目錄,能加快資料庫的查詢速度。

索引的分類

注意:索引是在儲存引擎中實現的,也就是說不同的儲存引擎,會使用不同的索引

myisam和innodb儲存引擎:只支援btree索引, 也就是說預設使用btree,不能夠更換

memory/heap儲存引擎:支援hash和btree索引

mysql的索引分為單列索引(主鍵索引,唯索引,普通索引)和組合索引.

單列索引:乙個索引只包含乙個列,乙個表可以有多個單列索引.

組合索引:乙個組合索引包含兩個或兩個以上的列,

1. 普通索引

這是最基本的索引,它沒有任何限制,比如上文中為title欄位建立的索引就是乙個普通索引,myiasm中預設的btree型別的索引,也是我們大多數情況下用到的索引。

2. 唯一索引

與普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值(注意和主鍵不同)。如果是組合索引,則列值的組合必須唯一,建立方法和普通索引類似。

3. 全文索引(fulltext)

mysql從3.23.23版開始支援全文索引和全文檢索,fulltext索引僅可用於 myisam 表;他們可以從char、varchar或text列中作為create table語句的一部分被建立,或是隨後使用alter table 或create index被新增。對於較大的資料集,將你的資料輸入乙個沒有fulltext索引的表中,然後建立索引,其速度比把資料輸入現有fulltext索引的速度更為快。不過切記對於大容量的資料表,生成全文索引是乙個非常消耗時間非常消耗硬碟空間的做法。

4. 單列索引、多列索引

多個單列索引與單個多列索引的查詢效果不同,因為執行查詢時,mysql只能使用乙個索引,會從多個索引中選擇乙個限制最為嚴格的索引。

5. 組合索引(最左字首)

平時用的sql查詢語句一般都有比較多的限制條件,所以為了進一步榨取mysql的效率,就要考慮建立組合索引。例如上表中針對title和time建立乙個組合索引:alter table article add index index_titme_time (title(50),time(10))。建立這樣的組合索引,其實是相當於分別建立了下面兩組組合索引:

–title,time

–title

為什麼沒有time這樣的組合索引呢?這是因為mysql組合索引「最左字首」的結果。簡單的理解就是只從最左面的開始組合。並不是只要包含這兩列的查詢都會用到該組合索引

create index nickname_account_createdtime_index on `award`(`nickname`, `account`, `created_time`);

使用索引需要注意的地方

在建立索引的時候應該考慮索引應該建立在資料庫表中的某些列上面 哪一些索引需要建立,哪一些所以是多餘的.

一般來說,

1.在經常需要搜尋的列上,可以加快索引的速度

2.主鍵列上可以確保列的唯一性

3.在表與表的而連線條件上加上索引,可以加快連線查詢的速度

4.在經常需要排序(order by),分組(group by)和的distinct 列上加索引 可以加快排序查詢的時間,  (單獨order by 用不了索引,索引考慮加where 或加limit)

5.在一些where 之後的 < <= > >= between in 以及某個情況下的like 建立欄位的索引(b-tree)

6.like語句的 如果你對nickname欄位建立了乙個索引.當查詢的時候的語句是 nickname lick '%abc%' 那麼這個索引講不會起到作用.而nickname lick 'abc%' 那麼將可以用到索引

7.索引不會包含null列,如果列中包含null值都將不會被包含在索引中,復合索引中如果有一列含有null值那麼這個組合索引都將失效,一般需要給預設值0或者 ' '字串

8.使用短索引,如果你的乙個欄位是char(32)或者int(32),在建立索引的時候指定字首長度 比如前10個字元 (前提是多數值是唯一的..)那麼短索引可以提高查詢速度,並且可以減少磁碟的空間,也可以減少i/0操作.

9.不要在列上進行運算,這樣會使得mysql索引失效,也會進行全表掃瞄

10.選擇越小的資料型別越好,因為通常越小的資料型別通常在磁碟,記憶體,cpu,快取中 占用的空間很少,處理起來更快

什麼情況下不建立索引

1.查詢中很少使用到的列 不應該建立索引,如果建立了索引然而還會降低mysql的效能和增大了空間需求.

2.很少資料的列也不應該建立索引,比如 乙個性別字段 0或者1,在查詢中,結果集的資料佔了表中資料行的比例比較大,mysql需要掃瞄的行數很多,增加索引,並不能提高效率

3.定義為text和image和bit資料型別的列不應該增加索引,

4.當表的修改(update,insert,delete)操作遠遠大於檢索(select)操作時不應該建立索引,這兩個操作是互斥的關係

什麼 情況下資料庫索引會失效

1.如果條件中有or,即使其中有條件帶索引也不會使用(這也是為什麼盡量少用or的原因)

注意:要想使用or,又想讓索引生效,只能將or條件中的每個列都加上索引

2.對於多列索引,不是使用的第一部分,則不會使用索引

3.like查詢是以%開頭

4.如果列型別是字串,那一定要在條件中將資料使用引號引用起來,否則不使用索引

5.如果mysql估計使用全表掃瞄要比使用索引快,則不使用索引

檢視索引的使用情況:

show status like 『handler_read%』;

注意:handler_read_key:這個值越高越好,越高表示使用索引查詢到的次數

handler_read_rnd_next:這個值越高,說明查詢低效

mysql 索引失效場景 Mysql 索引失效場景

例如 一張user表 有欄位屬性 name,age 其中name為索引 下面列舉幾個索引失效的情況 1.select from user where name xzz or age 16 例如這種情況 當語句中帶有or的時候 即使有索引也會失效。2.select from user where na...

Mysql 索引失效場景

例如 一張user表 有欄位屬性 name,age 其中name為索引 下面列舉幾個索引失效的情況 1.select from user where name xzz or age 16 例如這種情況 當語句中帶有or的時候 即使有索引也會失效。2.select from user where na...

Mysql 索引失效場景

例如 一張user表 有欄位屬性 name,age 其中name為索引 下面列舉幾個索引失效的情況 1.select from user where name xzz or age 16 例如這種情況 當語句中帶有or的時候 即使有索引也會失效。2.select from user where na...