说说数据库索引和MySQL的最左前缀匹配原则

组合索引

也就是说一个索引包含了多个列。

最左前缀原则:

建立多列索引(组合索引)有最左前缀的原则,即最左优先,比如:

如果有一个2列的索引(col1,col2),则已经对(col1)、(col1,col2)上建立了索引;

如果有一个3列索引(col1,col2,col3),则已经对(col1)、(col1,col2)、(col1,col2,col3)上建立了索引;

组合索引需要注意的几点:

  • 按照索引的最左列开始查询。如果组合索引建立在第1、2、3列上,但是查询时只用到第2、3列,那么该查询仍要全表扫描,该组合索引未使用。
  • 不能跳过索引中的列进行查询。
  • 如果组合索引建立在第1、2、3列上,但是查询时只用到第1、3列,那么该查询只会利用到第1列的索引,然后对第1列索引查出来的记录进行全部扫描。
  • 如果查询时某个列使用了范围查询,则其右边的列都无法使用索引进行查询优化。

order by和group by也遵循最左前缀原则。

如,

alter table city add index city_index(vc_Name, vc_City, i_Age)

建立这样的组合索引,其实是相当于分别建立了

vc_Name,vc_City,i_Age

vc_Name,vc_City

vc_Name

例,

说说数据库索引和MySQL的最左前缀匹配原则

下面的查询语句,打钩的表示该句用到了组合索引:

说说数据库索引和MySQL的最左前缀匹配原则

组合索引总结

  1. 如果select中的字段全部是组合索引的字段(不在乎顺序),那么,只要where中的字段全都是组合索引的字段(不在乎顺序、个数),那么该组合索引就会在该select中用到。
  2. 如果select中存在组合索引中没有的字段,那么,只要where中所有字段组合起来(可以是任意顺序)符合组合索引的最左前缀原则,那么该组合索引就会在该select中用到。
  3. 其他情况该组合索引不会被用到。


分享到:


相關文章: