无陈述,直接开讲: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
由于mysql的查询优化器会优化sql,优化器会根据存取类型选择合适的驱动表达式,对于这两条sql来讲驱动表达式同样。blog
查询优化器对where带AND的查询优化选择规则以下:索引
查询的格式为:<condition> AND <condition>开发
优化的步骤:get
1) 若是两个列都没有索引,那么使用全表扫描。
2) 不然,若是其中一个列拥有更好的存取类型(好比,一个具备索引,另一个没有索引;再或者,一个是惟一索引,另一个是非惟一索引),那么使用该列做为驱动表达式。
3) 不然,若是两个列都分别拥有索引,而且两个条件对应的存取类型是一致的,那么选择定义索引时的先定义的索引。
俩条件都有索引且相同,因此存取类型都同样,而且没有前后定义的顺序,因此执行彻底同样。
PS:account_id加在联合索引里彻底无心义,自己就是主键,优先命中,只有拖慢入库的速度。