Mysql笔记2--索引优化
双表
如果是左连接建立在左表的索引的话,可以换成右连接的查询语句. ---即 保证不是全表的那个表建立索引即可.(左/右连接相反建)
三表/多表
*避免索引失效
带头大哥不能死,在staffs表中通过nameAgePos建立了索引, 而前两次的查询中,均没有用到name,只用到了age和pos,因此索引会失效. 为避免失效,必须要用到带头的name!(火车头)
中间兄弟不能断,这里用到了索引,但是只是用到了name的索引,后面的pos索引没用到,(根据key_len和ref只有一个const可知),违背了最佳左前缀法则的"不跳过索引中间的列"
百分(%)like加右边
若非要在字符串两边都使用%,则可以通过覆盖索引的方法来解决索引失效问题.
即,建立的索引,最好和要查询的字段字段,顺序都一样!(注:主键默认使用index级别索引)
如果这里,name是varchar类型,如果 在查询的时候 不使用单引号,那么mysql会先以int类型去查找,如果查找不到结果,则会在底层隐式的将2000强转为'2000'再去查询,因此在这一过程中会消耗性能
(有计算过程也是会消耗性能)
口诀
全值匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能断;
索引列上无计算,范围之后全失效;
like百分加右边,覆盖索引不写星*
不等空值还有or,索引失效要少用;
字符串里有引号,SQL高级也不难
建索引的时候按照c1,c2,c3,c4建,但是查询的时候按照c4~c1查询仍然用到了索引,是因为在Mysql的服务层中有优化器让该语句按照索引查询
范围之后全失效--->是指mysql自动调优后的范围,而不是按照写的sql顺序
即,这里在调优后顺序应该是c1='a1',and c2='a2' and c3= 'a3' and c4 > 'a4' , 因为c4是索引的最后一个值,索引范围之后全失效的也不需要查了!
补充group by