一. 影响服务器性能的几个方面
- 服务器硬件
- 服务器的操作系统
- 数据库存储引擎的选择
- 数据库操作配置
- 数据库结构设计和SQL语句
二. SQL性能下降的原因
- 查询语句写的不好
- 索引失效
- 关联太多的jion
- 服务器调优和参数设置(一般是DBA来做的)
三.SQL读取顺序
- 不是从select开始,而是从from开始,要先知道你要读的是那张表才可以进行下一步
- 机读顺序
四.MySQL常见瓶颈
CPU: CPU在饱和的时候一般发生在数据装入内存或从磁盘读取数据的时候
IO: 磁盘I/O瓶颈发生在装入数据远大于内存容量的时候
服务器硬件的性能瓶颈
五. explain 分析SQL语句
5.1 explain 是什么?
模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句,有多个字段,通过查看字段可以知道你的SQL语句的问题在哪里
5.2 explain 怎么玩?
explain+ SQL语句(查询语句)
5.3 explain可以干什么?
- 表的读取顺序(id)
- 数据读取操作的操作类型(select_type)
- 可能用到的索引(possible_keys)
- 实际被用到的索引(key)
- 表之间的引用
- 每张表有多少行被优化器查询(rows)
六. explain字段分析
6.1 表的读取顺序id
id不同: id越大就越先被执行
id相同: 自上而下执行
6.2 数据操作读取类型(select_type)
-
simple 简单的select查询,查询中不包含子查询或者union
-
primary 查询中若包含任何复杂的子部分,最外层查询则被标记。最后执行那个
-
subquery 在select或where列表中包含了子查询
-
union 若第二个select出现在union之后,则被标记为union
-
union result 从union表获取结果的select
6.3 table操作的那张表
6.4 partitions-查询访问的分区
6.5 type
从最好到最坏
system > const > eq_ref > ref > range > index > ALL
system:表只有一行记录 (相当于系统表),相当于const的特例
const:通过一次索引就可以找到
eq_ref 唯一索引扫描,对于每个索引键,表中只有一条记录与之匹配
ref 非唯一性索引扫描,返回匹配某个单独值得所有行,本质上也是一种索引访问,它返回所有匹配某个单独值的行
range 只检索给定范围的行,使用一个索引来选择行。
index :只要查询那个字段建有索引,不管后面什么条件
ALL全盘扫描,最慢
6.6 possible_keys: 显示可能应用在这张表中的索引,一个或多个。
6.7 key: 实际使用的索引。如果为null,则没有使用索引
6,8 extra: 就是一些额外的消息,告诉你用了什么方法进行查找,有以下几种方法
Using filesort 说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取,MySQL中无法利用索引完成的排序操作称为"文件排序"
Using temporary,使用临时表保存中间结果,MySQL在对查询结果排序时使用临时表。
Using index:: 使用了索引,避免了全表扫描
Using where: 使用了where过滤
Using join buffer: 使用了连接缓存
impossible where: 不可能的条件,where子句的值总是false
6.8 ref: 显示索引那一列被用到了
6.9 rows一共有多少行被执行优化器执行到