索引使用规则
1, 最左前缀法则:适用于联合索引
知识点:查询时,必须包含最左边的那个列,在此案例中即列phone。
前置:创建联合索引:为表employee创建(phone,age,status)三个字段的联合索引
案例分析:
【情景一】执行如下SQL,where phone,age,status三个字段,而且中间并未跳过任何一列,查看执行计划
现象:索引长度43
解析:最左边字段存在,没有跳过任何列
结论:索引生效【情景二】执行如下SQL,保留phone,age,去掉status的条件,查看执行计划
现象:索引长度为39,说明status字段的索引长度为4,phone字段的索引为35
解析:最左边字段存在,跳过了status字段的索引
结论:索引生效【情景三】执行如下SQL,保留phone,去掉age , status的条件,查看执行计划
现象:索引长度为35,说明age字段的索引长度为4
解析:最左边字段存在
结论:索引生效【情景四】执行如下SQL,去掉phone字段的条件,保留age , status的,查看执行计划
解析:最左字段不存在,不满足最左前缀法则
结论:索引全部失效,全表扫描【情景五】执行如下SQL,保留phone,跳过age ,保留 status字段,查看执行计划
现象:索引长度只有35,说明status字段索引失效
解析:最左字段虽然存在,但是跳过字段
结论:索引部分失效【情景六】执行如下SQL,保留phone,age ,status字段,但是phone放在其他位置,查看执行计划
现象:索引长度为43
解析:索引当中最左边字段只要存在,与放置的位置无关
结论:索引生效2,范围查询 指的也是复合索引中的范围查询
知识点:范围查询右边的列索引将会失效
【情景一】执行如下SQL,查看执行计划
现象:索引长度为39,status字段的索引失效
解析:使用了范围查询,范围查询右边的列索引将会失效
结论:索引部分失效规避方案:在业务允许的范围尽量使用>= 或 <=的范围查询,如下:
索引长度为43,说明三个字段的索引都用上了