索引使用规则

1, 最左前缀法则:适用于联合索引

mysql的最左前缀 mysql最左前缀索引_字段

知识点:查询时,必须包含最左边的那个列,在此案例中即列phone。

前置:创建联合索引:为表employee创建(phone,age,status)三个字段的联合索引

mysql的最左前缀 mysql最左前缀索引_mysql的最左前缀_02

案例分析:

【情景一】执行如下SQL,where phone,age,status三个字段,而且中间并未跳过任何一列,查看执行计划

现象:索引长度43

mysql的最左前缀 mysql最左前缀索引_字段_03


解析:最左边字段存在,没有跳过任何列

结论:索引生效【情景二】执行如下SQL,保留phone,age,去掉status的条件,查看执行计划

现象:索引长度为39,说明status字段的索引长度为4,phone字段的索引为35

mysql的最左前缀 mysql最左前缀索引_sql_04


解析:最左边字段存在,跳过了status字段的索引

结论:索引生效【情景三】执行如下SQL,保留phone,去掉age , status的条件,查看执行计划

现象:索引长度为35,说明age字段的索引长度为4

mysql的最左前缀 mysql最左前缀索引_字段_05


解析:最左边字段存在

结论:索引生效【情景四】执行如下SQL,去掉phone字段的条件,保留age , status的,查看执行计划

mysql的最左前缀 mysql最左前缀索引_mysql的最左前缀_06


解析:最左字段不存在,不满足最左前缀法则

结论:索引全部失效,全表扫描【情景五】执行如下SQL,保留phone,跳过age ,保留 status字段,查看执行计划

现象:索引长度只有35,说明status字段索引失效

mysql的最左前缀 mysql最左前缀索引_字段_07


解析:最左字段虽然存在,但是跳过字段

结论:索引部分失效【情景六】执行如下SQL,保留phone,age ,status字段,但是phone放在其他位置,查看执行计划

现象:索引长度为43

mysql的最左前缀 mysql最左前缀索引_sql_08


解析:索引当中最左边字段只要存在,与放置的位置无关

结论:索引生效2,范围查询 指的也是复合索引中的范围查询

知识点:范围查询右边的列索引将会失效

mysql的最左前缀 mysql最左前缀索引_字段_09

【情景一】执行如下SQL,查看执行计划

现象:索引长度为39,status字段的索引失效

mysql的最左前缀 mysql最左前缀索引_字段_10


解析:使用了范围查询,范围查询右边的列索引将会失效

结论:索引部分失效规避方案:在业务允许的范围尽量使用>= 或 <=的范围查询,如下:

索引长度为43,说明三个字段的索引都用上了

mysql的最左前缀 mysql最左前缀索引_sql_11