赞
踩
性能分析explain
MySql Query Optimizer是MySql中专门负责优化select语句的优化器模块,主要功能:通过计算分析系统中收集到的系统信息,为客户端请求的Query提供他认为最优的执行计划(系统认为最优的数据检索方式,但不见得是DBA认为最优的,这部分最耗费时间)
MySQL常见瓶颈
CPU: CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候
IO: 磁盘I/O瓶颈发生在装入数据远大于内存容量的时候
服务器硬件的性能瓶颈:top,free, iostat和vmstat来查看系统的性能状态。
能干哈
表的读取顺序(对应explain的id)
数据读取操作的操作类型
哪些索引可以使用
哪些索引被实际使用
表之间的引用
每张表有多少行被优化器查询
id列数字越大越先执行;
如果说数字一样大,那么就从上往下依次执行;
id列为null的就表示这是一个结果集,不需要使用它来进行查询。
如果查询使用了别名,那么这里显示的是别名;
如果不涉及对数据表的操作,那么这显示为null;
如果显示为尖括号括起来的就表示这个是临时表,后边的N就是执行计划中的id,表示结果来自于这个查询产生;
如果是尖括号括起来的<union M,N>,与类似,也是一个临时表,表示这个结果来自于union查询的id为M,N的结果集
依次从好到差:system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL,除了all之外,其他的type都可以使用到索引,除了index_merge之外,其他的type只可以用到一个索引
常用的 system>const>eq_ref>ref>range>index>ALL
: 一般来说,得保证查询至少达到range级别,最好能达到ref。
!=, <>, >, >=, <, <=, IS NULL, <=>, BETWEEN, LIKE, or IN()
等运算符的查询中。select_type为index_merge时,这里可能出现两个以上的索引,其他的select_type这里只会出现一个。
如果是单列索引,那就整个索引长度算进去。
如果是多列索引,那么查询不一定都能使用到所有的列,具体使用到了多少个列的索引,这里就会计算进去,没有使用到的列,这里不会计算进去。留意下这个列的值,算一下你的多列索引总长度就知道有没有使用到所有的列了。要注意,mysql的ICP特性使用到的索引不会计入其中。另外,key_len只计算where条件用到的索引长度,而排序和分组就算用到了索引,也不会计算到key_len中。
如果是使用的常数等值查询,这里会显示const。
如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段。
如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func
这里是执行计划中估算的扫描行数,不是精确值
使用explain extended时会出现这个列,5.7之后的版本默认就有这个字段,不需要使用explain extended了。
这个字段表示存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例,注意是百分比,不是具体记录数。
索引合并交叉口访问算法(The Index Merge Intersection Access Algorithm):
index intersect merge就是多个索引条件扫描得到的结果进行交集运算。显然在多个索引提交之间是 AND 运算时,才会出现 index intersect merge. 下面两种where条件或者它们的组合时会进行 index intersect merge:
- 条件使用到复合索引中的所有字段或者左前缀字段;
- 主键上的任何范围条件。
intersect merge运行方式:多个索引同时扫描,然后结果取交集。如果所有条件字段都是索引字段,使用索引覆盖扫描,无需回表
示例:SELECT * FROM innodb_table WHERE primary_key < 10 AND key_col1 = 20;
SELECT * FROM tbl_name WHERE key1_part1 = 1 AND key1_part2 = 2 AND key2 = 2;索引合并联合访问算法(The Index Merge Union Access Algorithm):
index uion merge就是多个索引条件扫描,对得到的结果进行并集运算,显然是多个条件之间进行的是 OR 运算。以下几种可能会使用到index merge union: 1) 条件使用到复合索引中的所有字段或者左前缀字段(对单字段索引也适用);2) 主键上的任何范围条件;3) 任何符合 index intersect merge 的where条件;
示例:SELECT * FROM t1 WHERE key1 = 1 OR key2 = 2 OR key3 = 3;
SELECT * FROM innodb_table WHERE (key1 = 1 AND key2 = 2) OR (key3 = ‘foo’ AND key4 = ‘bar’) AND key5 = 5;索引合并排序联合访问算法(The Index Merge Sort-Union Access Algorithm):
多个条件扫描进行 OR 运算,但是不符合 index union merge算法的,此时可能会使用 sort_union算法,当WHERE子句转换为由组合的多个范围条件 时,此访问算法适用 OR,但索引合并并集算法不适用。
示例:SELECT * FROM tbl_name WHERE key_col1 < 10 OR key_col2 < 20;
SELECT * FROM tbl_name WHERE (key_col1 > 10 OR key_col2 = 20) AND nonkey_col = 30;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。