结合mysql查询优化器对联合索引的探讨

无陈述,直接开讲:mysql

babysitter_account表中的联合索引以下(开发小伙伴们自建的联合索引、您发现不妥了吗?):
sql

KEY `flag` (`flag`,`user_id`,`account_id`)

过去认为:ide

1.SELECT account_id,weibo_id,weibo_type FROM babysitter_account WHERE user_id BETWEEN 100 and 10000 AND flag=0; 
2.SELECT account_id,weibo_id,weibo_type FROM babysitter_account WHERE flag=0 AND user_id BETWEEN 100 and 10000;
优化

第一条sql没法命中索引、第二条会命中,spa

可是现实状况是两条sql命中的索引彻底同样。orm

wKioL1TV81TwtnIMAADE6Pd6IIY023.jpg

wKiom1TV8mXiRd-7AADjD-7ogy0933.jpg

由于mysql的查询优化器会优化sql,优化器会根据存取类型选择合适的驱动表达式,对于这两条sql来讲驱动表达式同样。blog

查询优化器对where带AND的查询优化选择规则以下:索引

查询的格式为:<condition> AND <condition>开发

 优化的步骤:get

1)        若是两个列都没有索引,那么使用全表扫描。

2)        不然,若是其中一个列拥有更好的存取类型(好比,一个具备索引,另一个没有索引;再或者,一个是惟一索引,另一个是非惟一索引),那么使用该列做为驱动表达式。

3)        不然,若是两个列都分别拥有索引,而且两个条件对应的存取类型是一致的,那么选择定义索引时的先定义的索引。

俩条件都有索引且相同,因此存取类型都同样,而且没有前后定义的顺序,因此执行彻底同样。

PS:account_id加在联合索引里彻底无心义,自己就是主键,优先命中,只有拖慢入库的速度。

相关文章
相关标签/搜索