(二)MySQL调优之EXPLAIN关键字

索引优化分析:

性能分析:

EXPLAIN关键字是什么?

1、简单说:查询执行计划
2、使用EXPLAIN关键字可以模拟优化器执行SQL查询于, 从而知道MySQL是如何处理你的SQL语句的
分析你的查询语句或是表结构的性能瓶颈

EXPLAIN关键字如何使用?

EXPLAIN后跟上SQL语句

EXPLAIN + SQL

EXPLAIN能干嘛?

1、表的读取顺序
2、数据读取操作的操作类型
3、哪些索引可以使用
4、哪些索引被实际使用
5、表之间的引用
6、每张表有多少行被优化器查询

查询的类具体的列

id select_type table type possible_keys key key_len ref rows Extra

各列详细解释

列名 说明
id 表的读取顺序:和table结合来看
id相同:执行顺序由上至下
id不同:id值越大优先级越高,越先被执行
id相同不同同时存在:id不同的值越大越先被执行,id相同的依次执行
select_type 数据读取操作的操作类型
有哪些?

SIMPLE:简单的select查询,查询中不包含子查询或者union
PRIMARY:查找中若包含任何复杂的子部分,最外层查询则被标记为
SUBQUERY:在SELECT或WHERE列表中包含了子查询
DERIVED:在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放在临时表中
UNION:若第二个SELCT出现在UNION之后,则被标记为UNION;若UNION包含在FROM子句的子查询中,外层SELCT被标记为DERIVED
UNION RESULT:从UNION表获取结果的SELECT
table 显示这一行数据是关于哪张表的
type 访问的类型

从最好到最差依次如下: system > const > eq_ref > ref > range -> index > all
system: 表只有一行记录(等于系统表), 这是const类型的特例,平时不会出现,这个也可以忽略不计
const:表示通过索引一次就找到了,const用于比较primary key或者unique索引, 因为只匹配一行数据,所以很快如将主键置于where列表中, MySQL就能将该查询转换为一个常量
eq_ref:唯一性索引扫描,对于每一个索引键,表中只有一条记录与之匹配, 常见于主键索引或是唯一索引
ref:非唯一性索引扫描,返回匹配某个单独值的所有行,本质上也是一种索引访问,它返回索引匹配某个单独值的行,然而它可能会找到多个符合条件的行,索引它应该属于查找和扫描的混合体
range:只检索给定范围的行, 使用一个索引来选择行, key列显示使用了那个索引一般就是在你的where语句中出现了between、>、<、in等查询,这种范围扫描索引比全表扫描要好,因为它只是需要开始于索引的某一点,而结束与另一点,不用扫描全部索引
index:Full Index Scan,index与ALL区别为index类型只遍历索引树,这通常比ALL快因为索引文件通常比数据文件小。也就是说虽然ALL和index都是读全表,但是index是从索引中读取的,而ALL是从硬盘读取的
ALL:Full Table Scan 将遍历全表以查找到匹配的行
一般来说的保证查询达到range以上,最好到ref
possible_keys 显示可能应用在这张表的索引,一个或者多个。查询设计到的字段若存在索引,则该索引将被列出。但是不一定被查询实际使用
key 实际使用的索引, 如果为NULL,则没有使用索引查询中若使用了覆盖索引,则该索引仅出现在key列表中
覆盖索引: 就是说select后面查询的字段和创建的索引顺序个数一一吻合
key_len 表示索引中使用的字节数,可通过该列计算查询中使用的索引的查询,在不存精确性的情况下,长度越短越好
key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是用过表内检索出的
ref ref:显示索引的那一列被使用了,如果可能的话,是一个常数,哪些列或常量被用于查找索引列上的值
rows rows:根据表统计信息及索引引用情况,大致估算出找到所需的记录要读取的行数
Extra 包含不适合在其他列中显示但十分重要的额外信息
Using filesort: 说明MySQL会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作称为“文件排序”,这里建议,在ORDER BY的时候一定要参考索引,不然容易文件呢排序,尽量避免
Using temporary: 使用了临时表保存中间结果,MySQL在对查询结果排序时使用了临时表。常见于ORDER BY和分组查询GROUP BY, 尽量避免
Using index: 表示相应的select操作中使用覆盖索引(Covering Index),避免访问了表的额数据行, 效率不错! 如果同时出现Using Where 表明索引被用来执行索引键值的查找;如果没有同时出现Using WHere 表明索引引用来读取数据而非执行查找动作
Using where: 使用了where过滤
Using join buffer:使用了连接缓存
impossible where: where子句的值总是false,不能用来获取任何元组
select table optimized away:在没有GROUP BY子句的情况下,基于索引优化MIN/MAX操作或者对应MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段在进行计算,查询执行计划生成的阶段即完成优化
distinct: 优化distinct操作,在知道第一匹配的元组后即停止找同样值的动作

覆盖索引:

就是select的数据列只用了索引中就能够取得,不必读取数据行,MySQL可以利用索引返回select列表中的字段,而不必根据索引再次读取数据文件,换句话说查询列要被所建的索引覆盖

原文地址:https://www.cnblogs.com/chenyichen/p/10591120.html

时间: 2024-10-31 14:48:15

(二)MySQL调优之EXPLAIN关键字的相关文章

MySQL调优系列基础篇

前言 有一段时间没有写博客了,整天都在忙,上班,录制课程,恰巧最近一段时间比较清闲,打算弄弄MYSQL数据库. 关于MySQL数据库,这里就不做过多的介绍,开源.免费等特性深受各个互联网行业喜爱,尤其在某些大型电商应用之后,更是将其推崇至极. 前面有一段时间我写过SQL Server数据库的一个调优系列,有兴趣的可以关注下. 从本篇起,我将开始分析关于MySQL数据库的一系列的调优内容,同样作为开篇,先就在MySQL调优中所最常用的查询计划进行解析,力图做好基础的掌握,夯实基本功!而后再谈谈整体

MySQL 调优/优化的 100 个建议

MySQL 调优/优化的 100 个建议 提交 我的评论 加载中 已评论 MySQL 调优/优化的 100 个建议 2015-07-08 数据库开发 数据库开发 数据库开发 微信号 DBDevs 功能介绍 分享数据库相关技术文章.教程和工具,另外还包括数据库相关的工作.偶尔也谈谈程序员人生 :) (点击上方蓝字,快速关注我们) (编注:本文写于 2011 年) MySQL是一个强大的开源数据库.随着MySQL上的应用越来越多,MySQL逐渐遇到了瓶颈.这里提供 101 条优化 MySQL 的建议

mysql 调优

转载:http://blog.csdn.net/yananwang/article/details/7030029 今天开始学习mysql调优啦 (偶那东一榔头西一棒子的学习历程的又一棒子) 好啦,言归正传: 首先,mysql调优有三个主要的方式,由低到高分别是: 1.硬件调优 2.修改mysql进程 3.优化mysql查询 一.硬件调优 先看看硬件调优吧.这个有两方面你可以考虑,首先对现有硬件条件进行修复,能调整的调整,能替换的替换,例如你可以把中央处理器(CPU)或磁盘速度加倍,也可以让内存

MySQL调优 —— Using temporary

DBA发来一个线上慢查询问题, SQL如下(为突出重点省略部分内容): select distinct article0_.id, 等字段 from article_table article0_, hits_table articlehit1_ where article0_.id=articlehit1_.id order by hits; EXPLAIN结果:耗时4.03S 出乎意料, 竟然会有Using temporary, order by只用到了一张表, 正常情况下不会出现借助辅助表

MySQL(用户管理,常用sql语句,数据库备份恢复,MySQL调优,恢复误操作数据)

一.MySQL用户管理. 一个MySQL数据库里可以跑多个库,总不能给所有人的程序员root用户,则可以给他们单独的用户访问数据库. 创建用户:(grant all on *.* to 'user1'是把所有库的权限给'user1,他的来源Ip是127.0.0.1,他的密码是lty123456') (第一个*是库名,如果你写成mysql.*那就是对mysql库的所有权限) (来源ip也可以写成 % ,表示来源的所有ip) (grant这种语句是不会记录到命令历史里去的,因为不安全.) mysql

mysql调优

MySQL调优可以从几个方面来做:1. 架构层:做从库,实现读写分离: 2.系统层次:增加内存:给磁盘做raid0或者raid5以增加磁盘的读写速度:可以重新挂载磁盘,并加上noatime参数,这样可以减少磁盘的i/o; 3. MySQL本身调优:(1) 如果未配置主从同步,可以把bin-log功能关闭,减少磁盘i/o(2) 在my.cnf中加上skip-name-resolve,这样可以避免由于解析主机名延迟造成mysql执行慢(3) 调整几个关键的buffer和cache.调整的依据,主要根

第 四 十 一 天:mysql 调 优 方 式

小Q:世界上最快而又最慢,最长而又最短,最平凡而又最珍贵,最易被人忽视 而又最让人后悔的就是时间.                    ----高尔基 ======================================================================= MySQL调优可以从几个方面来做: 1. 架构层: 做从库,实现读写分离: 2.系统层次: 增加内存: 给磁盘做raid0或者raid5以增加磁盘的读写速度: 可以重新挂载磁盘,并加上noatime参数

mysql调优 基础

MySQL调优可以从几个方面来做: 1. 架构层:做从库,实现读写分离: 2.系统层次:增加内存:给磁盘做raid0或者raid5以增加磁盘的读写速度:可以重新挂载磁盘,并加上noatime参数,这样可以减少磁盘的i/o; 3. MySQL本身调优:(1) 如果未配置主从同步,可以把bin-log功能关闭,减少磁盘i/o(2) 在my.cnf中加上skip-name-resolve,这样可以避免由于解析主机名延迟造成mysql执行慢(3) 调整几个关键的buffer和cache.调整的依据,主要

剑指架构师系列-MySQL调优

介绍MySQL的调优手段,主要包括慢日志查询分析与Explain查询分析SQL执行计划 1.MySQL优化 1.慢日志查询分析 首先需要对慢日志进行一些设置,如下: SHOW VARIABLES LIKE 'slow_query_log'; -- 查看是否开启了慢查询 SET GLOBAL slow_query_log_file='/var/lib/mysql/mysql-slow.log'; -- 设置慢查询日志的位置 SET GLOBAL log_queries_not_using_inde