Explain字段详解
1、Id 列
id列的编号是 select 的序列号,有几个 select 就有几个id,并且id的顺序是按 select 出现的顺序增长的。
id列越大执行优先级越高,id相同则从上往下执行,id为NULL最后执行。
2. select_type列
3、table
这一列表示explain的一行正在访问哪个表
当from子句有子查询时,table列是格式,表是当前查询依赖id=N的查询,于是先执行id=N的查询。
当有union时,UNION RESULT 的table列的值为<union1,2>,1和2表示参与union的select行id
4、type列
这一列表示关联类型或访问类型,即MySQL决定如何查找表中的行,查找数据行的大概范围。依次从最优到最差分别为:system>const>eq_ref>ref>range>index>ALL。一般来说,得保证查询达到range级别,最好达到ref
4.1、NULL
MySQL能在优化阶段分解查询语句,在执行阶段用不着访问表或索引。例如:在索引列中选择最小值,可以单独查找索引来完成,不需要在执行时访问表。
4.2、const,system
4.3、eq_ref
4.4、ref
4.5、range
4.6、index
4.7、ALL
5、possible_key列
6、key列
7、key_len列
8、ref列
9、rows列
10. Extra列
10.1、Using index:使用覆盖索引
10.2、Using where
10.3、Using index condition
10.4、Using temporary
10.5、 Using filesort
MySQL索引最佳实战
1、全值匹配
2、最左前缀法则
3、不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
4、存储引擎不能使用索引中范围条件右边的列
5、尽量使用覆盖索引(只访问索引的查询(索引列包含查询列)),减少 select * 语句
6、mysql在使用不等于(!=或者<>),not in ,not exists 的时候无法使用索引会导致全表扫描,< 小于、 > 大于、 <=、>= 这些,mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引
7、is null,is not null 一般情况下也无法使用索引
8、like以通配符开头(‘$abc…’)mysql索引失效会变成全表扫描操作
问题:解决like’%字符串%’索引不被使用的方法?
9、字符串不加单引号索引失效
10、少用or或in,用它查询时,mysql不一定使用索引,mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引,详见范围查询优化
11、范围查询优化
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。