接着上一篇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=''

  查看发现: 状态列中找到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) ;

  索引可具体参考:mysql 开发基础系列15 索引的设计和使用

mysql 开发进阶篇系列 2 SQL优化(explain分析)的更多相关文章

  1. mysql 开发进阶篇系列 4 SQL 优化(各种优化方法点)

    1 通过handler_read 查看索引使用情况 如果索引经常被用到 那么handler_read_key的值将很高,这个值代表了一个行被索引值读的次数, 很低的值表明增加索引得到的性能改善不高,索 ...

  2. mysql 开发进阶篇系列 5 SQL 优化(表优化)

    一. 使用sql提示 sql 提示(sql hint)是优化数据库的一个重要手段, 是在sql语句中加入一些人为的提示来达到优化操作的目的. 1.1 use index 在查询语句中表名的后面,添加u ...

  3. mysql 开发进阶篇系列 1 SQL优化(show status命令)

    一.概述 随着上线后,数据越来越多,很多sql语句开始显露出性能问题,本章介绍在mysql中优化sql语句的方法.  1.  通过show status 命令了解各种sql的执行频率 通过show [ ...

  4. mysql 开发进阶篇系列 3 SQL 优化(索引使用方法)

    一. 本章介绍mysql中的索引的分类,存储,使用方法的介绍 1.  索引的存储分类 MyISAM存储引擎的表的数据和索引是自动分开存储的,各自是独立的一个文件, innodb 存储引擎的表的数据和索 ...

  5. mysql 开发进阶篇系列 23 应用层优化与查询缓存

    一.概述 前面章节介绍了很多数据库的优化措施,但在实际生产环境中,由于数据库服务器本身的性能局限,就必须要对前台的应用来进行优化,使得前台访问数据库的压力能够减到最小. 1. 使用连接池 对于访问数据 ...

  6. mysql 开发进阶篇系列 46 物理备份与恢复( xtrabackup的 选项说明,增加备份用户,完全备份案例)

    一. xtrabackup 选项说明 在操作xtrabackup备份与恢复之前,先看下该工具的选项,下面记录了xtrabackup二进制文件的部分命令行选项,后期把常用的选项在补上.点击查看xtrab ...

  7. mysql 开发进阶篇系列 42 逻辑备份与恢复(mysqldump 的完全恢复)

    一.概述 在作何数据库里,备份与恢复都是非常重要的.好的备份方法和备份策略将会使得数据库中的数据更加高效和安全.对于DBA来说,进行备份或恢复操作时要考虑的因素大概有如下: (1) 确定要备份的表的存 ...

  8. mysql 开发进阶篇系列 55 权限与安全(安全事项 )

    一. 操作系统层面安全 对于数据库来说,安全很重要,本章将从操作系统和数据库两个层面对mysql的安全问题进行了解. 1. 严格控制操作系统账号和权限 在数据库服务器上要严格控制操作系统的账号和权限, ...

  9. mysql 开发进阶篇系列 47 物理备份与恢复(xtrabackup 的完全备份恢复,恢复后重启失败总结)

    一. 完全备份恢复说明 xtrabackup二进制文件有一个xtrabackup --copy-back选项,它将备份复制到服务器的datadir目录下.下面是通过 --target-dir 指定完全 ...

随机推荐

  1. Spring Beans和依赖注入

    您可以自由地使用任何标准的Spring框架技术来定义您的bean及其注入的依赖项.为简单起见,我们经常发现使用@ComponentScan(找到您的bean)和使用@Autowired(做构造函数注入 ...

  2. API setContentType(MIME) 参数说明

    HttpServletResponse的setContentType(MIME) API主要用以告诉浏览器服务器所传递的数据类型或服务器希望浏览器以何种方式解析和展示这些数据 其由两部分构成,如:te ...

  3. 图解HTTP第十章

    Web 的攻击技术 1>在客户端即可篡改请求 2>针对 Web 应用的攻击模式 3>因输出值转义不完全引发的安全漏洞 [1]跨站脚本攻击 [2]SQL 注入攻击 [3]OS 命令注入 ...

  4. linux下maven的安装

    上传安装包到相应路径 进行解压 tar -zxvf apache-maven-3.0.5-bin.tar.gz -C /export/servers/ 修改环境变量 vim /etc/profile ...

  5. SpringBoot_配置文件

    Properties配置 SpringBoot中采用了大量的自动化配置,但是对开发者而言,在实际项目中不可避免会有一些需要自己手动配置,承载这些自定义配置的文件就是resources 目录下的appl ...

  6. HTTP协议 与 TCP协议 的区别

    TCP协议是传输层协议,主要解决数据如何在网络中传输,而HTTP是应用层协议,主要解决如何包装数据. TCP/IP和HTTP协议的关系,从本质上来说,二者没有可比性,我们在传输数据时,可以只使用(传输 ...

  7. suse11 安装 python3.6 python3 安装步骤

    首先需要去网上下载Python-3.6.4.tgz,libopenssl-devel-0.9.8j-2.1.x86_64.rpm zlib-devel-1.2.7-3.14.x86_64.rpm li ...

  8. N!中末尾有多少个0

    问题:先从100!的末尾有多少零         =>    再推广到  任意N!的末尾有多少个零 分析:首先想到慢慢求解出100!或N!,但计算机表示数有限,且要防止溢出. 则从数学上分析:一 ...

  9. PowerBI

    1.官方PowerBI实例:https://docs.microsoft.com/zh-cn/power-bi/sample-tutorial-connect-to-the-samples 2.配置计 ...

  10. Shell变量类型和运算符-2