資料庫索引

2021-10-10 12:42:05 字數 3918 閱讀 2296

3. 索引失效

4.何時不使用索引?

背景:mysql資料庫,innodb儲存引擎

1.何為資料庫索引

**索引是對資料庫表中乙個或多個列的值進行排序的結構。**正是因為進行了排序,才會使索引可快速訪問資料庫表中的特定資訊。當然,索引本身也很重要。

2.索引分類

實際上根據不同劃分標準有多種分類方式

2.1 聚集(聚簇)索引與非聚集(聚簇)索引

1)聚集索引

在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。乙個表只能包含乙個聚集索引。如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。

每張表只允許有乙個聚集索引,所以聚集索引一般是表中的主鍵索引,如果表中沒有顯示指定主鍵,則會選擇表中的第乙個不允許為null的唯一索引,如果還是沒有的話,就採用innodb儲存引擎為每行資料內建的6位元組rowid作為聚集索引。

2)非聚集(聚簇)索引

除聚集索引以外的其他索引

2.2 單列索引和多列(聯合,組合,復合)索引

1)單列索引

顧名思義就是只匹配一列字段建立的索引。需要注意的是聚集索引是特殊的單列索引

2) 多列索引

顧名思義就是匹配多列字段建立的索引,但是乙個索引可以包含最多16列。需要注意最左字首匹配規則

舉例建立多列索引:

alter

table people add

index lname_fname_age (lame,fname,age)

;

最左字首匹配原則:

如果你建立乙個聯合索引, 那 這個索引的任何字首都會用於查詢, (col1, col2, col3)這個聯合索引的所有字首 就是(col1), (col1, col2), (col1, col2, col3), 包含這些列的查詢都會啟用索 引查詢.

mysql會一直向右匹配直到遇到範圍查詢(>、 3 and d = 4 如果建立(a,b,c,d)順序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引則都可以用到,a,b,d的順序可以任意調整=和in可以亂序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意順序,mysql的查詢優化器會幫你優化成索引可以識別的形式。

顧名思義,就是最左優先,上例中我們建立了lname_fname_age多列索引,相當於建立了(lname)單列索引,(lname,fname)組合索引以及(lname,fname,age)組合索引**。需要注意的是在mysql中執行查詢時,只能使用乙個索引。**

3. 索引失效

3.1 單列索引

mysql索引在一些情況下會失效

(1)查詢條件使用(!= 或者 < >)判斷,使用 is null / is not null 判斷

select

*from

`t_index`

where key1 <>

'1';

(2)查詢條件型別不一致(key1為非數字樂型別)

select

*from

`t_index`

where key1 =

1;

(3)對建立索引的列使用函式計算

select

*from

`t_index`

where key1 +1=

1;select

*from

`t_index`

where char_length(key1)=1

;

(4)模糊查詢的字首模糊(第二行的索引失效,其他行索引生效)

select

*from

`t_index`

where key1 like

'3';

select

*from

`t_index`

where key1 like

'%3'

;select

*from

`t_index`

where key1 like

'3%'

;

3.2 組合索引

(1)查詢條件使用(!= 或者 < >)判斷,使用 is null / is not null 判斷

select

*from

`t_index`

where key1 <>

'1'and key2 =

'2'and key3 =

'3';

select

*from

`t_index`

where key1 =

'1'and key2 <>

'2'and key3 =

'3';

select

*from

`t_index`

where key1 =

'1'and key2 =

'2'and key3 <>

'3';

結果:全部不走索引

(2)查詢條件型別不一致

select

*from

`t_index`

where key1 =

1and key2 =

'2'and key3 =

'3';

select

*from

`t_index`

where key1 =

'1'and key2 =

2and key3 =

'3';

select

*from

`t_index`

where key1 =

'1'and key2 =

'2'and key3 =

3;

結果:從第乙個查詢條件開始,第n個引數型別不一致,索引能使用前n-1列

(3)查詢條件使用函式計算

select

*from

`t_index`

where key1 +1=

'1'and key2 =

'2'and key3 =

'3';

select

*from

`t_index`

where key1 =

'1'and key2 +1=

'2'and key3 =

'3';

select

*from

`t_index`

where key1 =

'1'and key2 =

'2'and key3 +1=

'3';

結果:從第乙個查詢條件開始,第n個引數型別不一致,索引能使用前n-1列

注意點:不要在索引上做任何操作(計算、函式、自動/手動型別轉換),不然會導致索引失效而轉向全表掃瞄

小總結:

4.何時不使用索引?

雖然索引可以提高查詢效率,但是建立索引會增加額外的磁碟空間開銷;對索引進行頻繁增刪會頻繁調整b+樹的結構,會增加效能開銷;在資料量較小的情況下,是否建立索引對查詢效率影響不大。綜上,可知並不是所有情況都適合建立資料庫索引。

哪些情況不適合建索引?

表記錄太少。

經常增刪改的表的字段。

資料重複且分布平均的表字段,因此應該只為最經常查詢和最經常排序的資料列建立索引。如果某個資料列包含許多重複的內容,為它建立索引就沒太大的實際效果。

資料庫 資料庫索引

索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...

資料庫mysql索引 資料庫 mysql索引

mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...

資料庫索引

索引 索引列唯一索引 主鍵索引 聚簇索引和非聚簇索引 如何建立索引 如何刪除索引 使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構,例如 employee 表的姓 lname 列。如果要按姓查詢特定職員,與必須搜尋表中的所有行相比,索引會幫助您更快地獲得該資...