一、explain各字段含义:

 二、explain之id控制表结构执行顺序

id字段是select查询的序列号,是一组数字,表示的是查询中执行select子句或者是操作表的顺序。id情况有三种:

(1)id相同表示加载表的顺序是从上到下。

 

 

上图表查询顺序依次appapi,api,app

 (2)id不同id值越大,优先级越高,越先被执行。

 

 上图查询顺序依次ag_appication,ag_application_api,api表

 (3)id有相同,也有不同,同时存在。id相同的可以认为是一组,从上往下顺序执行;在所有的组中,id值越大,优先级越高,越先执行

 三、explain之select_type

查询类型从上到下效率越来越低

 例:

 四、explain之type

type显示的是访问类型,是较为重要的一个指标,可取值为:

 查询效率从上到下依次降低,一般来说我们需要保证查询至少达到range级别,最好达到ref

五、expliain 之 key

possible_keys:显示可能应用在这张表的索引,一个或多个

key:实际使用的索引,如果为null,则没有使用索引

key_len:表示索引中使用的字节数,该值为索引字段最大可能长度,并非实际使用长度,在不损失精确性的前提下,长度越短越好

六、expliain 之 rows

扫描行的数量

七、explain之extra

其它额外的信息

 前两个性能较差,出现需考虑优化

 八、索引失效情况:

举例:已建好name+status+address联合索引

1)最左前缀法则(复合索引):索引从最左边字段开始匹配,即必须带name字段才会走索引,否则不会

2)范围查询右边的列不会使用索引:如:where name='' and status > '1' and address='fsdfd' 只会走name和status索引,address不会走索引

3)不要在索引列上进行运算操作,否则索引失效: 如:where substring (name,3,2)='科技';      不会走索引

4)字符串不加单引号,索引失效

5)尽量使用覆盖索引(只访问索引的查询(索引列完全包含查询列)),减少select *。

6)用or分隔开的条件,如果or前的条件中的列有索引,而后面的列中没有索引,那么设计的索引都不会被用到。

如:where name='123' or createtime='xxx' name有索引而createtime没索引,索引都不会被用到

7)以%开头的like模糊查询,索引失效。如果仅仅是尾部模糊匹配,索引不会失效。头部模糊匹配,索引会失效

解决方法是使用覆盖索引

8)如果MYSQL评估使用索引比全表更慢,则不适用索引

9)is NULL,is NOT NULL有时索引失效(取决于表记录null值是否过多,mysql内部执行器自行决定是否走索引)

10)in 走索引, not in索引失效

11)尽量使用复合索引,而少使用单列索引(多个条件查询时,单列索引不会全部使用,数据库会选择一个最优的单列索引)