MYSQL索引之聯合索引詳解

2021-09-24 18:57:05 字數 2144 閱讀 6449

比較簡單的是單列索引(b+tree)。遇到多條件查詢時,不可避免會使用到多列索引。聯合索引又叫復合索引。

b+tree結構如下:

每乙個磁碟塊在mysql中是乙個頁,頁大小是固定的,mysql innodb的預設的頁大小是16k,每個索引會分配在頁上的數量是由字段的大小決定。當字段值的長度越長,每一頁上的數量就會越少,因此在一定資料量的情況下,索引的深度會越深,影響索引的查詢效率。

對於復合索引(多列b+tree,使用多列值組合而成的b+tree索引)。遵循最左側原則,從左到右的使用索引中的字段,乙個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index (a,b,c). 可以支援a a,b a,b,c 3種組合進行查詢,但不支援 b,c進行查詢。當使用最左側欄位時,索引就十分有效。

建立表test如下:

create table test(

a int,

b int,

c int,

key a(a,b,c)

);

比如(a,b,c)的時候,b+數是按照從左到右的順序來建立搜尋樹的,比如當(a=? and b=? and c=?)這樣的資料來檢索的時候,b+樹會優先比較a列來確定下一步的所搜方向,如果a列相同再依次比較b列和c列,最後得到檢索的資料;但當(b=? and c=?)這樣的沒有a列的資料來的時候,b+樹就不知道下一步該查哪個節點,因為建立搜尋樹的時候a列就是第乙個比較因子,必須要先根據a列來搜尋才能知道下一步去**查詢。比如當(a=? and c=?)這樣的資料來檢索時,b+樹可以用a列來指定搜尋方向,但下乙個欄位b列的缺失,所以只能把a列的資料找到,然後再匹配c列的資料了, 這個是非常重要的性質,即索引的最左匹配特性。

以下通過例子分析索引的使用情況,以便於更好的理解聯合索引的查詢方式和使用範圍。

一、多列索引在and查詢中應用

select * from test where a=? and b=? and c=?;查詢效率最高,索引全覆蓋。

select * from test where a=? and b=?;索引覆蓋a和b。

select * from test where b=? and a=?;經過mysql的查詢分析器的優化,索引覆蓋a和b。

select * from test where a=?;索引覆蓋a。

select * from test where b=? and c=?;沒有a列,不走索引,索引失效。

select * from test where c=?;沒有a列,不走索引,索引失效。

二、多列索引在範圍查詢中應用

select * from test where a=? and b between ? and ? and c=?;索引覆蓋a和b,因b列是範圍查詢,因此c列不能走索引。

select * from test where a between ? and ? and b=?;a列走索引,因a列是範圍查詢,因此b列是無法使用索引。

select * from test where a between ? and ? and b between ? and ? and c=?;a列走索引,因a列是範圍查詢,b列是範圍查詢也不能使用索引。

三、多列索引在排序中應用

select * from test where a=? and b=? order by c;a、b、c三列全覆蓋索引,查詢效率最高。

select * from test where a=? and b between ? and ? order by c;a、b列使用索引查詢,因b列是範圍查詢,因此c列不能使用索引,會出現file sort。

四,總結

聯合索引的使用在寫where條件的順序無關,mysql查詢分析會進行優化而使用索引。但是減輕查詢分析器的壓力,最好和索引的從左到右的順序一致。

使用等值查詢,多列同時查詢,索引會一直傳遞並生效。因此等值查詢效率最好。

索引查詢遵循最左側原則。但是遇到範圍查詢列之後的列索引失效。

排序也能使用索引,合理使用索引排序,避免出現file sort。

文章參考:

mysql聯合索引詳解 mysql 聯合索引詳解

聯合索引又叫復合索引。對於復合索引 mysql從左到右的使用索引中的字段,乙個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index a,b,c 可以支援a a,b a,b,c 3種組合進行查詢,但不支援 b,c進行查詢 當最左側欄位是常量引用時,索引就十分有效。兩個或更多個...

mysql聯合索引詳解

聯合索引又叫復合索引。對於復合索引 mysql從左到右的使用索引中的字段,乙個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index a,b,c 可以支援a a,b a,b,c 3種組合進行查詢,但不支援 b,c進行查詢 當最左側欄位是常量引用時,索引就十分有效。兩個或更多個...

MySQL 聯合索引詳解

mysql 聯合索引詳解 聯合索引又叫復合索引。對於復合索引 mysql從左到右的使用索引中的字段,乙個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index a,b,c 可以支援a a,b a,b,c 3種組合進行查詢,但不支援 b,c進行查詢 當最左側欄位是常量引用時,索...