mysql 开发进阶篇系列 2 SQL优化(explain分析)
接着上一篇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分析)的更多相关文章
- mysql 开发进阶篇系列 4 SQL 优化(各种优化方法点)
1 通过handler_read 查看索引使用情况 如果索引经常被用到 那么handler_read_key的值将很高,这个值代表了一个行被索引值读的次数, 很低的值表明增加索引得到的性能改善不高,索 ...
- mysql 开发进阶篇系列 5 SQL 优化(表优化)
一. 使用sql提示 sql 提示(sql hint)是优化数据库的一个重要手段, 是在sql语句中加入一些人为的提示来达到优化操作的目的. 1.1 use index 在查询语句中表名的后面,添加u ...
- mysql 开发进阶篇系列 1 SQL优化(show status命令)
一.概述 随着上线后,数据越来越多,很多sql语句开始显露出性能问题,本章介绍在mysql中优化sql语句的方法. 1. 通过show status 命令了解各种sql的执行频率 通过show [ ...
- mysql 开发进阶篇系列 3 SQL 优化(索引使用方法)
一. 本章介绍mysql中的索引的分类,存储,使用方法的介绍 1. 索引的存储分类 MyISAM存储引擎的表的数据和索引是自动分开存储的,各自是独立的一个文件, innodb 存储引擎的表的数据和索 ...
- mysql 开发进阶篇系列 23 应用层优化与查询缓存
一.概述 前面章节介绍了很多数据库的优化措施,但在实际生产环境中,由于数据库服务器本身的性能局限,就必须要对前台的应用来进行优化,使得前台访问数据库的压力能够减到最小. 1. 使用连接池 对于访问数据 ...
- mysql 开发进阶篇系列 46 物理备份与恢复( xtrabackup的 选项说明,增加备份用户,完全备份案例)
一. xtrabackup 选项说明 在操作xtrabackup备份与恢复之前,先看下该工具的选项,下面记录了xtrabackup二进制文件的部分命令行选项,后期把常用的选项在补上.点击查看xtrab ...
- mysql 开发进阶篇系列 42 逻辑备份与恢复(mysqldump 的完全恢复)
一.概述 在作何数据库里,备份与恢复都是非常重要的.好的备份方法和备份策略将会使得数据库中的数据更加高效和安全.对于DBA来说,进行备份或恢复操作时要考虑的因素大概有如下: (1) 确定要备份的表的存 ...
- mysql 开发进阶篇系列 55 权限与安全(安全事项 )
一. 操作系统层面安全 对于数据库来说,安全很重要,本章将从操作系统和数据库两个层面对mysql的安全问题进行了解. 1. 严格控制操作系统账号和权限 在数据库服务器上要严格控制操作系统的账号和权限, ...
- mysql 开发进阶篇系列 47 物理备份与恢复(xtrabackup 的完全备份恢复,恢复后重启失败总结)
一. 完全备份恢复说明 xtrabackup二进制文件有一个xtrabackup --copy-back选项,它将备份复制到服务器的datadir目录下.下面是通过 --target-dir 指定完全 ...
随机推荐
- APP动态加载轮播图片
如果APP里面的轮播图片是动态加载的话,那么你会发现他不会轮播(前提是mui框架),这里都是用的mui框架,动态加载的图片因为mui的js查不到html上面没有图片,所以就不会轮播,需要手动重置下轮播 ...
- Python 打印矩形、直角三角形、等腰三角形、菱形
# 1)打印一个星号 print('*') #2)打印一行6个星号 * * * * * * for i in range(6): print('*',end=' ') #3)打印6列星号 * * * ...
- 运用PIL库 用来美白,磨皮,瘦脸等操作!
1.安装pillow库: 在cmd下,输入简单的命令: pip install pillow 即可安装pillow库. 2.PIL库的简介: 1. PIL库主要有2个方面的功能: (1) 图像归档: ...
- redis学习-集合set常用命令
redis学习-集合set常用命令 1.sadd:添加一个元素到集合中(集合中的元素无序的并且唯一) 2.smembers:查看集合中所有的元素(上图事例) 3.srem:删除结合中指定的元素 4 ...
- mount的几个选项
一.mount -o noatime表示在读文件时不去更改文件的access time属性了,所以该选项会提升mount操作的执行效率. 二.mount --bind:等同于 -o bind可用于挂载 ...
- Core Expression
https://docs.oracle.com/cd/E12058_01/doc/doc.1014/e12030/cron_expressions.htm A Cron Expressions Cro ...
- CSS伪类的理解
因为之前一直对css伪类没有过多的了解,在网上看到一段css代码,不能理解 a:hover span.title{ color:red; ......... } 现通过查询css手册,其实css伪类只 ...
- Sql- Group By ,Where,having用法
Group by,where,having 是数据库查询中最常用的几个关键字.在工作中,时常用到,前面遇到一个问题,一个查询中使用了where ,group by ,having及聚集函数时 ,执行顺 ...
- FPGA开发随笔汇总
点击标题即可进入相关随笔. DE-SOC开发板VrilogHDL开发相关部分: (本过程需要Verilog HDL 的基本语言基础) 1.FPGA的发展史及FPGA 的基础架构 2.首先看一下友晶DE ...
- Python爬取淘宝店铺和评论
1 安装开发需要的一些库 (1) 安装mysql 的驱动:在Windows上按win+r输入cmd打开命令行,输入命令pip install pymysql,回车即可. (2) 安装自动化测试的驱动s ...