Mysql多列索引建立與優化.md

zero__007發表於2020-11-08

轉載自:https://www.jianshu.com/p/c964a5e04adb


  
  對於單列索引,沒有太多的話題,但是對於多列索引的建立,一個好的多列索引能使用的場景應可以涵蓋很多,減少其他不必要的索引空間,就有很多事情需要注意。

索引的物理結構

http://www.jianshu.com/p/1775b4ff123a

1. where 子句中的多列索引

如果表有多個列索引,可以使用任何左邊的字首索引的優化器來查詢。例如, 有一個三列的索引(col1、col2 col3), 有索引搜尋功能(col1),(col1,col2),(col1、col2、col3)。

1.1 可以完全使用該索引的優化的情況

1)where中條件只有col1等於常量; 查詢可以用到索引。
2)where中條件只有col1為範圍(>,<,>=,<=);查詢可以用到索引。
3)where中條件有col1,col2,且col1等於常量,col2等於常量;可以用到索引。
4)where中條件有col1,col2,且col1等於常量,col2等於範圍;可以用到索引。
5)where中條件有col1,col2,col3,且col1,col2,col3均等於常量;可以用到索引。
6)where中條件有col1,col2,col3,且col1,col2均等於常量,col3為範圍;可以用到索引。

1.2 可以部分使用該索引的優化的情況

1)where中條件col1等於常量,無col2,col3的常量或範圍,只能用到col1的索引;
2)where中條件col1等於常量,col2的範圍,col3的常量或範圍,只能用到col1、col2的索引;
3)where中條件col1的範圍,col2、col3的常量或範圍,只能用到col1的索引;

1.3 不能使用該索引的優化的情況

下列情況均需要掃描所有行再進行篩選,因為多列索引的第一列沒有在條件中。
1)col2 常量或範圍;
2)col3 常量或範圍;
3)col2、col3 常量或範圍;

相關文章