怎么看sql语句有没有走索引(sql索引失效有哪些情况会失效)
MySQL中创建索引的原则,有以下几点:
1、表的主键、外键必须有索引;
2、经常与其他表进行连接的表,在连接字段上应该建立索引;
3、选择唯一性索引;
唯一性索引unique index和一般索引normal index最大的差异就是在索引列上增加了一层唯一约束。
4、对于查询频率高的字段创建索引;
5、对排序、分组、联合查询频率高的字段创建索引;
6、尽量使用前缀来索引;
前缀索引是MySQL中的一个概念,在SQL Server和Oracle中没提出这个概念。前缀索引就是对文本的前几个字符(具体是几个字符在建立索引时指定)建立索引,这样建立起来的索引更小,所以查询更快。前缀索引能有效减小索引文件的大小,提高索引的速度,但是前缀索引也有它的坏处:MySQL 不能在 ORDER BY 或 GROUP BY 中使用前缀索引,也不能把它们用作覆盖索引(Covering Index)。
7、索引应该建在选择性高的字段上,在选择性低的字段上不必要建立索引,如:性别字段;
8、索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引;
9、索引列不能参与计算,保持列“干净”;
10、对于定义为 text、image 和 bit 的数据类型的列不要建立索引;
11、若在实际中,需要将多个列设置索引时,可以采用多列索引;
12、一个表的索引的数目不宜太多;
13、删除不再使用或者很少使用的索引,避免对执行计划造成负面影响;
MySQL什么时候不走索引?主要3种情况:
1、不满足走索引的条件,常见的情况有
1.1、不满足最左匹配原则(索引的底层是一颗B 树,最左优先,以最左边的为起点任何连续的索引都能匹配上,同时遇到范围查询(>、<、between、like)就会停止匹配。);
1.2、查询条件使用了函数;
1.3、or 操作有一个字段没有索引(必须所有的or条件都必须是独立索引才能用到索引);
1.4、使用 like条件以%开头;
2、走索引效率低于全表扫描,常见的情况有
2.1、查询条件对 null 做判断,而 null 的值很多;
2.2、一个字段区分度很小,比如:性别、状态;
3、需要回表的查询结果集过大,超过了配置的范围