mysql语句怎么优化 mysql 怎么优化

MySQL常用优化方案语句执行后,会显示三个字段mysql语句怎么优化: Query_ID(执行ID) | Duration(持续时间)| Query(查询语句) ;
拿到后Query_ID后 , 可执行 show profile for query Query_ID ,查看详细的准备时间,执行时间、执行结束( preparing、executing、end )等 。
显示用户正在运行的线程,需要注意的是,除了 root 用户能看到所有正在运行的线程外,其mysql语句怎么优化他用户都只能看到自己正在运行的线程,看不到其它用户正在运行的线程 。除非单独个这个用户赋予了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检查使用哪个索引,并用它来从表中返回行 。这是使用索引的最慢的连接之一
(4).Using filesort
看到这个的时候,查询就需要优化了 。MYSQL需要进行额外的步骤来发现如何对返回的行排序 。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行;

推荐阅读