MySQL 三万字精华总结 + 面试100 问,吊打面试官绰绰有余(收藏系列) (16)

在优化MySQL时,通常需要对数据库进行分析,常见的分析手段有慢查询日志EXPLAIN 分析查询profiling分析以及show命令查询系统状态及系统变量,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。

性能瓶颈定位

我们可以通过 show 命令查看 MySQL 状态及变量,找到系统的瓶颈:

Mysql> show status ——显示状态信息(扩展show status like ‘XXX’) Mysql> show variables ——显示系统变量(扩展show variables like ‘XXX’) Mysql> show innodb status ——显示InnoDB存储引擎的状态 Mysql> show processlist ——查看当前SQL执行,包括执行状态、是否锁表等 Shell> mysqladmin variables -u username -p password——显示系统变量 Shell> mysqladmin extended-status -u username -p password——显示状态信息 Explain(执行计划)

是什么:使用 Explain 关键字可以模拟优化器执行SQL查询语句,从而知道 MySQL 是如何处理你的 SQL 语句的。分析你的查询语句或是表结构的性能瓶颈

能干吗:

表的读取顺序

数据读取操作的操作类型

哪些索引可以使用

哪些索引被实际使用

表之间的引用

每张表有多少行被优化器查询

怎么玩:

Explain + SQL语句

执行计划包含的信息(如果有分区表的话还会有partitions

expalin

各字段解释

id(select 查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序)

id相同,执行顺序从上往下

id全不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行

id部分相同,执行顺序是先按照数字大的先执行,然后数字相同的按照从上往下的顺序执行

select_type(查询类型,用于区别普通查询、联合查询、子查询等复杂查询)

SIMPLE :简单的select查询,查询中不包含子查询或UNION

PRIMARY:查询中若包含任何复杂的子部分,最外层查询被标记为PRIMARY

SUBQUERY:在select或where列表中包含了子查询

DERIVED:在from列表中包含的子查询被标记为DERIVED,MySQL会递归执行这些子查询,把结果放在临时表里

UNION:若第二个select出现在UNION之后,则被标记为UNION,若UNION包含在from子句的子查询中,外层select将被标记为DERIVED

UNION RESULT:从UNION表获取结果的select

table(显示这一行的数据是关于哪张表的)

type(显示查询使用了那种类型,从最好到最差依次排列 system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

system:表只有一行记录(等于系统表),是 const 类型的特例,平时不会出现

const:表示通过索引一次就找到了,const 用于比较 primary key 或 unique 索引,因为只要匹配一行数据,所以很快,如将主键置于 where 列表中,mysql 就能将该查询转换为一个常量

eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常见于主键或唯一索引扫描

ref:非唯一性索引扫描,范围匹配某个单独值得所有行。本质上也是一种索引访问,他返回所有匹配某个单独值的行,然而,它可能也会找到多个符合条件的行,多以他应该属于查找和扫描的混合体

range:只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引,一般就是在你的where语句中出现了between、<、>、in等的查询,这种范围扫描索引比全表扫描要好,因为它只需开始于索引的某一点,而结束于另一点,不用扫描全部索引

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwygy.html