博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mysql 开发进阶篇系列 2 SQL优化(explain分析)
阅读量:6176 次
发布时间:2019-06-21

本文共 1859 字,大约阅读时间需要 6 分钟。

   接着上一篇sql优化来说

  1. 定位执行效率较低的sql 语句

  通过两种方式可以定位出效率较低的sql 语句。

  (1) 通过上篇讲的慢日志定位,在mysqld里写一个包含所有执行时间超过 long_query_time秒的sql语句的日志文件,后面具体介绍。
  (2) 通过show processlist 实时定位线程状态,是否锁表等,下面简单演示下show processlist:

    先模拟会话1表锁,再会话2更新该表city的数据,由于会话1表锁没有释放,会话2更新会一直会等待尝试去获取更新锁,再通过show processlist查看

-- 会话 1获取city 表锁LOCK TABLE city READ;-- 会话2更新city表UPDATE city SET citycode='001'

  查看发现: 状态列中找到waiting for table metadata lock(等待 table元数据锁),当前线程的info 信息 如下所示:

  

   2. 通过explain 来分析sql执行计划

  通过上篇的慢日志定位和processlist 找出效率低的sql语句后,可以通过explain或者desc命令获取mysql 如何执行查询语句的信息。

--  查看执行计划(二种方式一样) DESC SELECT   LedRecycleInfoLogID FROM LedLogInfo WHERE LedRecycleInfoLogID=2; EXPLAIN SELECT   LedRecycleInfoLogID FROM LedLogInfo WHERE LedRecycleInfoLogID=2;

类型

说明

Select_type 表示select 的类型

取值有:

   simple:简单表不使用表连接或子查询

       Primary:主查询

       Union: union中的第二个或者后面的查询语句

       Subquery: 子查询中的第一个select 

Type 表示表的连接类型

性能由好到差依次是:

  system: 表中仅有一行。

  Const: 单表中最多有一个匹配行, 例如 primary key, unique index

  Eq_ref: 多表连接下使用primary key 或者unique index

  Ref: 与Eq_ref区别在于使用普通索引。

  Ref_or_null: 与Ref区别在于条件中包含有null值的查询

  Index_merge: 索引合并优化

  Unique_subquery: in的后面是一个查询主键字段的子查询

 Index_subquery: 与 Unique_subquery区别在于in后面查询非唯一索引字段的子查询

  Range: 单表中的范围查询

  Index: 全表索引扫描

  All :全表扫描

           Possible_keys

表示查询时,可能使用的索引

            key

表示实际使用的索引

           Key_len

索引字段的长度.  长度越短, 性能越好

           rows

扫描的行数

           extra

执行情况的说明和描述

 

  3. 确定问题采取优化措施

  通过上面的索引解释,可以对照sql语句进行问题确认,以及索引的优化。如重点查看 rows 扫描了多少行, type 取值对应的性能, key字段和extra描述都可以来确定该语句是否需要调优。下面是各种索引的创建:

-- 主键索引ALTER TABLE city ADD PRIMARY KEY(city_id);-- 唯一索引ALTER TABLE city ADD UNIQUE  KEY(city_id);-- 普通索引 或叫辅助索引CREATE INDEX ixcityname ON city(cityname);-- 前缀索引 cityname字段创建10个字节CREATE INDEX ixcityname ON city(cityname(10));-- 复合索引  创建city表的多列CREATE INDEX ix1 ON city(cityname(10),citycode);-- 外键索引ALTER TABLE city ADD KEY idx_fk_country_id(country_id) ;

   索引可具体参考:

 

转载于:https://www.cnblogs.com/MrHSR/p/9328815.html

你可能感兴趣的文章
一个字典通过dictionaryWithDictionary 他们的内存指针是不同的
查看>>
HTTP 错误 500.0的解决方法。
查看>>
CCF201612-1 中间数(解法三)(100分)
查看>>
百度前端任务一学习的知识
查看>>
C# 四个字节十六进制数和单精度浮点数之间的相互转化
查看>>
JavaNIO的总结
查看>>
阿里云总监课第五期PPT下载地址
查看>>
时间属性
查看>>
第十九章:集合视图(十七)
查看>>
BIOS
查看>>
Elasticsearch之元数据(meta-fields)介绍
查看>>
基于Django+Bootstrap框架,可视化展示内存监控信息
查看>>
Pytorch | BERT模型实现,提供转换脚本【横扫NLP】
查看>>
biostar handbook: 第七周笔记汇总+调整通知
查看>>
涨薪必备|给你一份超详细Spring Boot知识清单
查看>>
YII2 关联查询,不修改search, 使用 GridView::widget 输出
查看>>
DNS服务-了解篇
查看>>
Apache Shiro在web开发安全技术中的应用
查看>>
源码安装MySQL 5.1 GA
查看>>
苹果电脑获取Android Studio的发布版SHA1和开发版SHA1
查看>>