对大多数应用没有意义,只是规定一些工具用来显示字符的个数;int(l)和int(20)存储和计算均一样;
MySQL中如何定位及优化SQL语句的性能问题?创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因?
对于低性能的SQL语句的定位,最重要也是最有效的方法就是使用执行计划,MySQL提供了explain命令来查看语句的执行计划。我们知道,不管是哪种数据库,或者是哪种数据库引擎,在对一条SQL语句进行执行的过程中都会做很多相关的优化,对于查询语句,最重要的优化方式就是使用索引。而执行计划,就是显示数据库引擎对于SQL语句的执行的详细情况,其中包含了是否使用索引,使用什么索引,使用的索引的相关信息等。
执行计划包含的信息id有一组数字组成。表示一个查询中各个子查询的执行顺序;
1、 id相同执行顺序由上至下。
2、 id不同,id值越大优先级越高,越先被执行。
3、 id为null时表示一个结果集,不需要使用它查询,常出现在包含union等查询语句中。
select_type每个子查询的查询类型,一些常见的查询类型。
id select_type description
1 SIMPLE 不包含任何子查询或union等 查询
2 PRIMARY 包含子查询最外层查询就显示 为 PRIMARY
3 SUBQUERY 在select或where字句中包含 的查询
4 DERIVED from字句中包含的查询
5 UNION 出现在union后的查询语句中
6 UNION RESULT 从UNION中获取结果集例如上文的第三个例子
table查询的数据表, 当从衍生表中查数据时会显示X 表示对应的执行计划id partitions
表分区、表创建的时候可以指定通过那个列进行表分区。举个例子:
id int unsigned not null AUT0_INCREMENT,
name varchar(255),
PRIMARY KEY (id)
)engine = innodb partition by key (id) partitions 5;
type(非常重要,可以看到有没有走索引)访问类型
1、 ALL扫描全表数据
2、 index遍历索引
3、 range索引范围查找
4、 index_subquery在子查询中使用ref
5、 unique_subquery 在子查询中使用 eq_ref
6、 ref_or_null对Null进行索引的优化的ref
7、 fulltext使用全文索引
8、 ref使用非唯一索引查找数据
9、 eq_ref 在 join 查询中使用 PRIMARY KEYorUNIQUE NOT NULL 索引关联。
10、 possible_keys可能使用的索引,注意不一定会使用。查询涉及到的字段上若存在索引, 则该索引将被列出来。当该列为NULL时就要考虑当前的SQL是否需要优化了。
11、 key显示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULL。
12、 TIPS:查询中若使用了覆盖索引(覆盖索引:索引的数据覆盖了需要查询的所有数据),则该索引仅出现在key列表中
13、 key_length 索引长度
14、 ref表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值
15、 rows返回估算的结果集数目,并不是一个准确的值。
16、 extra的信息非常丰富,常见的有:
17、 Using index使用覆盖索引
18、 Using where使用了用where子句来过滤结果集
19、 Using filesort使用文件排序,使用非索引列进行排序时出现,非常消耗性能,尽量优化。
20、Using temporary使用了临时表sql优化的目标可以参考阿里开发手册
推荐
SQL性能优化的目标:至少要达到range级别,要求是ref级别,如果可以是consts最好
说明:
1、 consts单表中最多只有一个匹配行(主键或者唯一索引),在优化阶段即可读取到数据。
2、 ref指的是使用普通的索引(normal index)。
3、 range对索引进行范围检索。
反例:
explain表的结果,type=index,索引物理文件全扫描,速度非常慢,这个index级别比较range 还低,与全表扫描是小巫见大巫。
Was this helpful?
0 / 0