教你如何定位及优化SQL语句的性能问题

在现如今的软件开发中,关系型数据库是做数据存储最重要的工具。无论是Oracale还是Mysql,都是需要通过SQL语句来和数据库进行交互的,这种交互我们通常称之为CRUD。在CRUD操作中,最最常用的也就是Read操作了。而对于不同的表结构,采用不同的SQL语句,性能上可能千差万别。本文,就基于MySql数据库,来介绍一下如何定位SQL语句的性能问题。

教你如何定位及优化SQL语句的性能问题

对于低性能的SQL语句的定位,最重要也是最有效的方法就是使用执行计划。

一、执行计划

我们知道,不管是哪种数据库,或者是哪种数据库引擎,在对一条SQL语句进行执行的过程中都会做很多相关的优化,对于查询语句,最重要的优化方式就是使用索引。

而执行计划,就是显示数据库引擎对于SQL语句的执行的详细情况,其中包含了是否使用索引,使用什么索引,使用的索引的相关信息等。

执行计划

基本语法
explain select ...
mysql的explain 命令可以用来分析select 语句的运行效果。

除此之外,explain 的extended 扩展能够在原本explain的基础上额外的提供一些查询优化的信息,这些信息可以通过mysql的show warnings命令得到。
mysql> explain extended select * from account;
******** 1. row ***************************
          id: 1
select_type: SIMPLE
       table: account
        type: ALL
possible_keys: NULL
         key: NULL
     key_len: NULL
         ref: NULL
        rows: 1
    filtered: 100.00
       Extra:
1 row in set, 1 warning (0.00 sec)

mysql> show warnings;
*************1. row ***************************
Level: Note
  Code: 1003
Message: select `dbunit`.`account`.`id` AS `id`,`dbunit`.`account`.`name` AS `name` from `dbunit`.`account`
1 row in set (0.00 sec)

另外,对于分区表的查询,需要使用partitions命令。

explain partitions select ...

二、执行计划包含的信息

不同版本的Mysql和不同的存储引擎执行计划不完全相同,但基本信息都差不多。mysql执行计划主要包含以下信息:

执行计划包含的信息

id

由一组数字组成。表示一个查询中各个子查询的执行顺序;

  • id相同执行顺序由上至下。

id相同执行顺序由上至下。

  • id不同,id值越大优先级越高,越先被执行。

id不同,id值越大优先级越高,越先被执行。

  • id为null时表示一个结果集,不需要使用它查询,常出现在包含union等查询语句中。

union查询语句

select_type

每个子查询的查询类型,一些常见的查询类型。

select_type

table

查询涉及到的数据表。

如果查询使用了别名,那么这里显示的是别名,如果不涉及对数据表的操作,那么这显示为null,如果显示为尖括号括起来的就表示这个是临时表,后边的N就是执行计划中的id,表示结果来自于这个查询产生。如果是尖括号括起来的,与类似,也是一个临时表,表示这个结果来自于union查询的id为M,N的结果集。

type

访问类型

  • ALL   扫描全表数据
  • index 遍历索引
  • range 索引范围查找
  • index_subquery 在子查询中使用 ref
  • unique_subquery 在子查询中使用 eq_ref
  • ref_or_null 对Null进行索引的优化的 ref
  • fulltext 使用全文索引
  • ref   使用非唯一索引查找数据
  • eq_ref 在join查询中使用PRIMARY KEYorUNIQUE NOT NULL索引关联。
  • const 使用主键或者唯一索引,且匹配的结果只有一条记录。
  • system const 连接类型的特例,查询的表为系统表。

type

上一页123下一页


留言