MySQL通过show status查看、explain分析优化数据库性能


当前第2页 返回上一页

如上图所示每个列的简单解释如下:

  • select_type:表示 SELECT 的类型,常见的取值有:
    • SIMPLE(简单表,即不使用表连接 或者子查询)。
    • PRIMARY(主查询,即外层的查询)、UNION(UNION 中的第二个或 者后面的查询语句)、◎SUBQUERY(子查询中的第一个SELECT)等。
  • table:输出结果集的表。
  • type:表示表的连接类型,性能由好到差的连接类型为:
    • system(表中仅有一行,即常量表)。
    • const(单表中最多有一个匹配行,例如primary key或者unique index)。
    • eq_ref(对于前面的每一行,在此表中只查询一条记录,简单来说,就是多表连接中使用primary key或者unique index)。
    • ref(与eq_ref类似,区别在于不是使用primary key或者unique index,而是使用普通的索引)。
    • ref_or_null(与ref类似,区别在于条件中包含对NULL的查询)。
    • index_merge(索引合并优化)。
    • unique_subquery(in的后面是一个查询主键字段的子查询)。
    • index_subquery(与unique_subquery类似,区别在于in的后面是查询非唯一索引字段的子查询)。
    • range(单表中的范围查询)。
    • index(对于前面的每一行,都通过查询索引来得到数据)。
    • all(对于前面的每一行,都通过全表扫描来得到数据)。
  • possible_keys:表示查询时,可能使用的索引。
  • key:表示实际使用的索引。
  • key_len:索引字段的长度。
  • rows:扫描行的数量。
  • filtered:返回结果的行占需要读到的行(rows列的值)的百分比。
  • Extra:执行情况的说明和描述。
    • Using index(此值表示mysql将使用覆盖索引,以避免访问表)。
    • Using where(mysql 将在存储引擎检索行后再进行过滤,许多where条件里涉及索引中的列,当(并且如果)它读取索引时,就能被存储引擎检验,因此不是所有带where子句的查询都会显示“Using where”。有时“Using where”的出现就是一个暗示:查询可受益于不同的索引)。
    • Using temporary(mysql 对查询结果排序时会使用临时表)。
    • Using filesort(mysql会对结果使用一个外部索引排序,而不是按索引次序从表里读取行。mysql有两种文件排序算法,这两种排序方式都可以在内存或者磁盘上完成,explain不会告诉你mysql将使用哪一种文件排序,也不会告诉你排序会在内存里还是磁盘上完成)。
    • Range checked for each record(index map: N) (没有好用的索引,新的索引将在联接的每一行上重新估算,N是显示在possible_keys列中索引的位图,并且是冗余的)。

5.确定问题并采取相应的优化措施

经过以上定位步骤,我们基本就可以分析到问题出现的原因。此时我们可以根据情况采取相应的改进措施,进行优化提高语句执行效率。
在上面的例子中,已经可以确认是goods_stock是走主键索引的,但是对goods_stock_price子表的进行了全表扫描导致效率的不理想,那么应该对goods_stock_price表的GoodsStockID字段创建索引,具体命令如下:

-- 创建索引
CREATE INDEX idx_stock_price_1 ON goods_stock_price (GoodsStockID);
-- 附加删除跟查询索引语句
ALTER TABLE goods_stock_price DROP INDEX idx_stock_price_1;
SHOW INDEX FROM goods_stock_price;

创建索引后,我们再看一下这条语句的执行计划,具体如下:

EXPLAIN SELECT SUM(sp.Qty)
FROM goods_stock AS s LEFT JOIN goods_stock_price AS sp
ON s.ID=sp.GoodsStockID;

可以发现建立索引后对goods_stock_price子表需要扫描的行数明显减少(从 3 行减少到1行),可见索引的使用可以大大提高数据库的访问速度,尤其在表很庞大的时候这种优势更为明显。

到此这篇关于MySQL通过show status查看、explain分析优化数据库性能的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。

更多SQL内容来自木庄网络博客


打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...