查询分析explain的使用
在了解索的具体使用之前我们想了解一下MySQL中用于性能分析的工具Explain,这里面的语法是很简单的重点在于要理解其中各个字段的含义,便于可以在后面的分析中能够读懂其中的含义并加以分析。
1、id
表明执行顺序,id越大优先级越高优先被执行,id值相同的情况下,从上到下执行
2、select_type
标识出的是查询的类型,需要重点理解一下
3、table——表名
4.type——访问类型
访问类型也是sql分析中一个重要的指标,通常来说他的顺序是system>const>eq_ref>ref>range>index>ALL system通常是我们不能够达到的级别,因为这指的是系统级别的常量或是表。但是在应用中我们也应该尽量避免ALL的场景他是全表扫描。
表示通过索引一次就找到,在下面的列子中content虽然也是索引但是他并不是唯一性索引所以说他的type类型就是ref级别
唯一性索引扫描,对于一个主键,表中只有一条记录与之匹配
这个应该是用上了覆盖索引,要读取的数据刚好全部都在索引中,所以不需要再次从磁盘中读取;而all是所有的数据都需要去磁盘中读取。所以说index相对于all要稍微好一些,虽然他们都对全表进行了扫描但是index扫描的是索引文件。相对来说减少了来了磁盘IO的次数。
5、possible_keys—可能用到的索引
6、key—实际上用到的索引
7、key_len—索引的长度
所有数据类型的列中如果要是允许为null那么长度是需要增加1,如果要是对于varchar类型,是动态类型的话需要加2
如果列的类型为int那么他的初始长度为4,char类型的则是**长度*3,**在结合上面的进行计算
8、ref
表示的是哪些常量或是列,被用于索引中值的查找
9、rows——Mysql 认为执行时候他必须检查的行数
10、extra——不适合在其他列中显示但是又非常重要的信息
查询中使用了文件内排序,这是一种较为影响系统性能的一个指标。他的语义是建数据读到Buffer Pool中之后又在Buffer Pool中进行了排序。在索引优化中应该考虑是不是索引失效。
使用临时表保存中间结构,常见于order by 与group by中
使用了覆盖索引
where中的值总是false,没能取到任何元组
Mysiam的结构中会存储一个总行数的结构,所以如果要是用count()的时候就会产生这样的效果。
在没有group by子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化count操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。