mysql怎么优化条件 mysql优化十大技巧( 五 )


对比下以上两个 , 加了HINT的比不加HINT的cost小了100倍 。
总结下,就是说表的cardinality值影响这张的查询计划,如果这个值没有正常更新的话,就需要手工加HINT了 。相信MySQL未来的版本会带来更多的HINT 。
MySQL常用优化方案语句执行后 , 会显示三个字段: Query_ID(执行ID) | Duration(持续时间)| Query(查询语句) ;
拿到后Query_ID后,可执行 show profile for query Query_ID  , 查看详细的准备时间,执行时间、执行结束( preparing、executing、end )等 。
显示用户正在运行的线程 , 需要注意的是,除了 root 用户能看到所有正在运行的线程外,其他用户都只能看到自己正在运行的线程 , 看不到其它用户正在运行的线程 。除非单独个这个用户赋予了PROCESS 权限 。
显示字段包含: User| Host| db | Command | Time| State| Info 等 。
解析语句 , 查询是否命中索引,及 , 命中何种索引,用以判断是否符合我们的预期 。
返回字段包含: select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra等 。
select_type常见类型:
(1) SIMPLE(简单SELECT,不使用UNION或子查询等)
(2) PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)
(3) UNION(UNION中的第二个或后面的SELECT语句)
(4) SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询)
table常见类型:
显示这一行的数据是关于哪张表的.
有时不是真实的表名字,看到的是derivedx(x是个数字,我的理解是第几步执行的结果)
type常见类型:
对表访问方式 , 表示MySQL在表中找到所需行的方式,又称“访问类型” 。
常用的类型有:ALL、index、range、 ref、eq_ref、const、system、NULL (从左到右,性能从差到好)
possible_keys
指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出 , 但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null)
该列完全独立于EXPLAIN输出所示的表的次序 。这意味着在possible_keys中的某些键实际上不能按生成的表次序使用 。
如果该列是NULL,则没有相关的索引 。在这种情况下,可以通过检查WHERE子句看是否它引用某些列或适合索引的列来提高你的查询性能 。如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询
key
key列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中
如果没有选择索引,键是NULL 。要想强制MySQL使用或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX 。
key_len
表示索引中使用的字节数 , 可通过该列计算查询中使用的索引的长度,非实际长度,为最大可能长度 。
注:不损失精确性的情况下,长度越短越好 。
ref
列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值 。
rows
估算出结果集行数,表示MySQL根据表统计信息及索引选用情况 , 估算的找到所需的记录所需要读取的行数;
extra
该列包含MySQL解决查询的详细信息,有以下几种情况:
(1).Distinct
一旦MYSQL找到了与行相联合匹配的行,就不再搜索了
(2).Not exists
MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了
(3).Range checked for each
Record(index map:#)
没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引 , 并用它来从表中返回行 。这是使用索引的最慢的连接之一

推荐阅读